2016-03-15 122 views
8

我有一個JPEG圖像存儲在我想調整大小的字節[]中。這是我的代碼:UWP:如何調整圖像大小

public async Task<byte[]> ResizeImage(byte[] imageData, int reqWidth, int reqHeight, int quality) 
{ 

    var memStream = new MemoryStream(imageData); 

    IRandomAccessStream imageStream = memStream.AsRandomAccessStream(); 
    var decoder = await BitmapDecoder.CreateAsync(imageStream); 
    if (decoder.PixelHeight > reqHeight || decoder.PixelWidth > reqWidth) 
    { 
     using (imageStream) 
     { 
      var resizedStream = new InMemoryRandomAccessStream(); 

      BitmapEncoder encoder = await BitmapEncoder.CreateForTranscodingAsync(resizedStream, decoder); 
      double widthRatio = (double) reqWidth/decoder.PixelWidth; 
      double heightRatio = (double) reqHeight/decoder.PixelHeight; 

      double scaleRatio = Math.Min(widthRatio, heightRatio); 

      if (reqWidth == 0) 
       scaleRatio = heightRatio; 

      if (reqHeight == 0) 
       scaleRatio = widthRatio; 

      uint aspectHeight = (uint) Math.Floor(decoder.PixelHeight*scaleRatio); 
      uint aspectWidth = (uint) Math.Floor(decoder.PixelWidth*scaleRatio); 

      encoder.BitmapTransform.InterpolationMode = BitmapInterpolationMode.Linear; 

      encoder.BitmapTransform.ScaledHeight = aspectHeight; 
      encoder.BitmapTransform.ScaledWidth = aspectWidth; 

      await encoder.FlushAsync(); 
      resizedStream.Seek(0); 
      var outBuffer = new byte[resizedStream.Size]; 
      uint x = await resizedStream.WriteAsync(outBuffer.AsBuffer()); 
      return outBuffer; 
     } 
    } 
    return imageData; 
} 

問題是outBuffer只包含零,儘管已經寫入了正確的字節數。

回答

9

正是從這個

uint x = await resizedStream.WriteAsync(outBuffer.AsBuffer()); 

更換您的線路以這樣的代碼:

await resizedStream.ReadAsync(outBuffer.AsBuffer(), (uint)resizedStream.Size, InputStreamOptions.None); 
+1

非常感謝。這有點直觀而且在線文檔並不足夠 – Thomas

0

我在同樣的問題,上週跌入谷底,結束了看起來像這樣的解決方案。

private async Task<StorageFile> RescaleImage(StorageFile sourceFile, StorageFile resizedImageFile,uint width,uint height) 
{ 
    var imageStream = await sourceFile.OpenReadAsync(); 
    var decoder = await BitmapDecoder.CreateAsync(imageStream); 
    using (var resizedStream = await resizedImageFile.OpenAsync(FileAccessMode.ReadWrite)) 
    { 
     var encoder = await BitmapEncoder.CreateForTranscodingAsync(resizedStream, decoder); 
     encoder.BitmapTransform.InterpolationMode = BitmapInterpolationMode.Linear; 
     encoder.BitmapTransform.ScaledWidth = width; 
     encoder.BitmapTransform.ScaledHeight = height; 
     await encoder.FlushAsync(); 
    } 
    return resizedImageFile; 
}