繁体   English   中英

将 32bpp 转换为 8bpp UWP

[英]Convert 32bpp to 8bpp UWP

我试图将 InkCanvas 绘制为 8bpp 图像,但是当我尝试这样做时,图像将自身转换为 32bpp,我得到的较低的是 24bpp 但不是 8bpp。 任何人都可以帮助我吗? 我作为输入提供的图像是用油漆创建的 8bpp BMP 图像。

        Image imgToEdit;
        InkCanvas inkCanvas;
        file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(Ambiente.imgBlankFirma);
        
        await file.CopyAsync(photoFolder, NomeFile, NameCollisionOption.ReplaceExisting);
        file = await photoFolder.GetFileAsync(NomeFile);

        imgToEdit = imgFirma;
        inkCanvas = inkCanvasFirma;
        
        if (inkCanvas.InkPresenter.StrokeContainer.GetStrokes().Count <= 0)
        {
            errore = true;
            return;
        }

        var randomAccessStream = await file.OpenReadAsync();
        

        CanvasDevice device = CanvasDevice.GetSharedDevice();
        
        CanvasRenderTarget renderTarget = new CanvasRenderTarget(device, (int)inkCanvas.ActualWidth, (int)inkCanvas.ActualHeight, 96); //inkCanvas.ActualWidth inkCanvas.ActualHeight
        
        using (var ds = renderTarget.CreateDrawingSession())
        {
            var image = await CanvasBitmap.LoadAsync(device, randomAccessStream);
            // draw your image first
            ds.DrawImage(image);
            // then draw contents of your ink canvas over it
            ds.DrawInk(inkCanvas.InkPresenter.StrokeContainer.GetStrokes());
        }

        randomAccessStream.Dispose();

        // save results
        using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
        {
            await renderTarget.SaveAsync(fileStream, CanvasBitmapFileFormat.Tiff, 1f);
        }

这显示了如何手动进行转换。 它需要对图像数据的直接指针访问 因此,只需为转换目标创建一个具有正确大小的新 8bpp(即 Format8bppIndexed)位图。 所以转换数据应该是这样的:

public static unsafe void Bgr24ToMono8(byte* source, byte* target, int sourceStride, int targetStride, int width, int height)
{

        Parallel.For(0, height, y =>
        {
            var sourceRow = source + y * sourceStride;
            var targetRow = y * targetStride;
            for (int x = 0; x < width; x++)
            {
                var sourceIndex = (sourceRow + x * 3);
                var value = (byte)(sourceIndex[0] * 0.11f + sourceIndex[1] * 0.59f + sourceIndex[2] * 0.3f);
                target[targetRow + x] = value;
            }
        });
}

如果您有 32bpp 数据,那应该只是将x * 3更改为x * 4 请注意,关于 Bgr 与 Rbg 存在一些混淆,不同的上下文对同一事物使用不同的术语。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM