3

Windows 8 アプリを開発しています。サイズ変更された画像をバイトとして取得したい。したがって、私のメソッドは StorageFile、高さと幅を取得し、私byte[]またはサイズ変更された画像を返します。これまでに試したことを以下に示します。私の努力により、すべての値が 0 の byte[] が返されます。

PS:サイズ変更された新しいStorageFileを作成したくありません。また、1つのメソッドだけに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 を使用してピクセル データを同期的に要求し、ビットマップの生のピクセルにアクセスできます。

つまりDetachPixelDataPixelDataProviderオブジェクトを呼び出すだけで済みます。

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 に答える