2016-03-15 14 views
8

Ich habe ein JPEG-Bild in einem Byte [] gespeichert, das ich die Größe ändern möchte. Dies ist mein Code:UWP: Wie man ein Bild in der Größe ändert

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

Das Problem ist, dass outBuffer nur Nullen enthält, obwohl die richtige Anzahl von Bytes geschrieben wurden.

Antwort

9

Ersetzen Sie einfach Ihre Linie von dieser

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

zu diesem Code:

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

Vielen Dank. Es ist ein bisschen kontra intuitiv Und die Online-Dokumentation ist nicht wirklich ausreichend – Thomas

0

ich auf das gleiche Problem letzte Woche stolperte und mit einer Lösung endete die wie folgt aussieht.

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