SoftwareBitmap 是 UWP 中的新增功能。我从这个开始:

var softwareBitmap = EXTERNALVALUE;

// do I even need a writeable bitmap?
var writeableBitmap = new WriteableBitmap(softwareBitmap.PixelWidth, softwareBitmap.PixelHeight);
softwareBitmap.CopyToBuffer(writeableBitmap.PixelBuffer);

// maybe use BitmapDecoder?

我很茫然。谢谢你。

请注意,我不是指 BitmapImage ;我的意思是 SoftwareBitmap

最佳答案

在这里,我获取一个图像文件并将其缩小为 100x100 SoftwareBitmap 并将其作为 ImageSource 返回。

既然你已经有了 SoftwareBitmap,我认为你的任务会更容易。但希望这能给你一个想法。

在初始化我们新缩放的 WritableBitmap 实例时,我们只需要 PixelBuffer 作为 SoftwareBitmap 。如果您可以直接从我们拥有的 byte[] 像素数据( 像素 局部变量)创建一个 IBuffer,您可以直接将其提供给 SoftwareBitmap.CreateCopyFromBuffer() 方法。在这种情况下不需要 WritableBitmap

这是代码:

private async Task<ImageSource> ProcessImageAsync(StorageFile ImageFile)
    {
        if (ImageFile == null)
            throw new ArgumentNullException("ImageFile cannot be null.");

        //The new size of processed image.
        const int side = 100;

        //Initialize bitmap transformations to be applied to the image.
        var transform = new BitmapTransform() { ScaledWidth = side, ScaledHeight = side, InterpolationMode = BitmapInterpolationMode.Cubic };

        //Get image pixels.
        var stream = await ImageFile.OpenStreamForReadAsync();
        var decoder = await BitmapDecoder.CreateAsync(stream.AsRandomAccessStream());
        var pixelData = await decoder.GetPixelDataAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied, transform, ExifOrientationMode.RespectExifOrientation, ColorManagementMode.ColorManageToSRgb);
        var pixels = pixelData.DetachPixelData();

        //Initialize writable bitmap.
        var wBitmap = new WriteableBitmap((int)decoder.PixelWidth, (int)decoder.PixelHeight);
        await wBitmap.SetSourceAsync(stream.AsRandomAccessStream());

        //Create a software bitmap from the writable bitmap's pixel buffer.
        var sBitmap = SoftwareBitmap.CreateCopyFromBuffer(wBitmap.PixelBuffer, BitmapPixelFormat.Bgra8, side, side, BitmapAlphaMode.Premultiplied);

        //Create software bitmap source.
        var sBitmapSource = new SoftwareBitmapSource();
        await sBitmapSource.SetBitmapAsync(sBitmap);

        return sBitmapSource;
    }

附注。我知道这句话不应该是答案的一部分,但我必须说,我从您的 MVA 和 Channel9 视频中学到了很多关于 XAML/C# 和开发 Windows 应用商店应用的知识! :)

关于c# - 如何调整 SoftwareBitmap 的大小?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41251716/

10-10 19:43