如何调整SoftwareBitmap的大小?

时间:2016-12-20 21:43:23

标签: c# uwp

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

3 个答案:

答案 0 :(得分:2)

看起来像拐杖,但它可能会解决您的问题:

{{1}}

你必须从nuget获得Win2D软件包。

答案 1 :(得分:2)

我已经使用 ScaleEffect 进行了一些尝试,并以下面的扩展方法结束。事实上,该方法需要更多的工作,但它可能会帮助你以某种方式进一步发展。

@Html.CheckBoxFor(m => m.newsletterOptin, new Dictionary<string, object>() {
    { "id", "newsletterOptin" },
    { "checked", "@(Model.newsletterOptin ? true : false)" }
})

答案 2 :(得分:1)

在这里,我拍摄一张图片文件并将其缩小为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;
    }

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