3

我正在开发 Windows 8 应用程序。我想将调整大小的图像作为字节。所以我的方法将获得 StorageFile、高度和宽度,它会返回我byte[]或调整大小的图像。我到目前为止所尝试的内容如下。我的努力使我返回 byte[],所有值都为 0。

PS:我不想创建新的调整大小的 StorageFile 也不想仅将 WritableBitmapEx 用于一种方法。

private async Task<byte[]> ResizeImage(StorageFile BigFile, uint finalHeight, uint finalWidth)
{
    using (var sourceStream = await BigFile.OpenAsync(FileAccessMode.Read))
    {
        BitmapDecoder decoder = await BitmapDecoder.CreateAsync(sourceStream);
        BitmapTransform transform = new BitmapTransform() { ScaledHeight = finalHeight, ScaledWidth = finalWidth };
        PixelDataProvider pixelData = await decoder.GetPixelDataAsync(
            BitmapPixelFormat.Rgba8,
            BitmapAlphaMode.Straight,
            transform,
            ExifOrientationMode.RespectExifOrientation,
            ColorManagementMode.DoNotColorManage);

        InMemoryRandomAccessStream ras = new InMemoryRandomAccessStream();

        BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, ras);
        encoder.SetPixelData(BitmapPixelFormat.Rgba8, BitmapAlphaMode.Premultiplied, finalWidth, finalHeight, 96, 96, pixelData.DetachPixelData());
        await encoder.FlushAsync();

        var bb = new byte[ras.Size];
        await ras.ReadAsync(bb.AsBuffer(), (uint)ras.Size, InputStreamOptions.None);
        return bb;
    }
}
4

1 回答 1

3

从 MSDN 的PixelDataProvider 类

应用程序从 BitmapFrame 或 BitmapDecoder 的 GetPixelDataAsync 方法异步接收 PixelDataProvider。然后,应用程序可以使用 DetachPixelData 同步请求像素数据,以访问位图的原始像素。

这意味着您只需要调用DetachPixelData对象PixelDataProvider

private async Task<byte[]> ResizeImage(StorageFile BigFile, uint finalHeight, uint finalWidth)
{
    using (var sourceStream = await BigFile.OpenAsync(FileAccessMode.Read))
    {
        BitmapDecoder decoder = await BitmapDecoder.CreateAsync(sourceStream);
        BitmapTransform transform = new BitmapTransform() { ScaledHeight = finalHeight, ScaledWidth = finalWidth };
        PixelDataProvider pixelData = await decoder.GetPixelDataAsync(
            BitmapPixelFormat.Rgba8,
            BitmapAlphaMode.Straight,
            transform,
            ExifOrientationMode.RespectExifOrientation,
            ColorManagementMode.DoNotColorManage);

        byte[] buffer = pixelData.DetachPixelData();    
        return buffer;
    }
}
于 2013-10-30T19:36:38.080 回答