2016-03-15 9 views
8

サイズを変更したいByte []に​​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; 
} 
関連する問題