首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将32bpp转换为8bpp UWP

将32bpp转换为8bpp UWP
EN

Stack Overflow用户
提问于 2021-10-28 08:39:35
回答 1查看 69关注 0票数 0

我试图将InkCanvas绘制为8bpp的图像,但当我尝试将图像本身转换为32bpp时,我得到的较低值是24bpp,而不是8bpp。有谁能帮我吗?我给出的图像作为输入是一个用画图创建的8bpp的BMP图像。

代码语言:javascript
复制
        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);
        }
EN

回答 1

Stack Overflow用户

发布于 2021-10-29 08:54:53

这展示了如何手动进行转换。它需要对图像数据进行direct pointer access。因此,只需为转换目标创建一个具有正确大小的新的8bpp (即Format8bppIndexed)位图。因此,转换数据应该如下所示:

代码语言:javascript
复制
public static unsafe void Bgr24ToMono8(byte* source, byte* target, int sourceStride, int targetStride, int width, int height)
{

        for(var y = 0; y < 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之间存在一些混淆,不同的上下文对同一事物使用不同的术语。

请注意,这会将位图转换为8bpp 灰度。如果你需要8bpp的颜色索引,这将是更多的工作,因为你理想情况下需要找到一个最佳的颜色映射,在所述映射中找到最接近的颜色,并应用抖动来避免条带。为此,我推荐一些图像处理库。我不认为有任何内置的函数可以做到这一点,而且在这里需要做很多工作来演示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69750844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档