2016-03-15 17 views
8

UWP: Görüntüyü yeniden boyutlandırma Nasıl yeniden boyutlandırmak istediğiniz bir Byte [] içinde depolanmış bir JPEG resmim var.

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; 
} 

sorun Bayt doğru sayıda yazılı olmasına rağmen outBuffer sadece sıfırları içerdiğini geçerli: Bu benim kodudur.

cevap

9

Sadece bu koda bu

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

adresinin hattını değiştirin: Geçen hafta aynı sorun tökezledi ve şöyle bir çözüm ile sona erdi

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

Çok teşekkürler. Bu biraz karşı sezgisel ve online dokümantasyon gerçekten yeterli değil – 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; 
} 
İlgili konular