将32bpp转换为8bpp UWP



我试图将InkCanvas绘制为8bpp的图像,但当我尝试这样做时,图像将自己转换为32bpp,我得到的较低是24bpp,而不是8bpp。有人能帮我吗?我给出的输入图像是用paint创建的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)
{
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的颜色索引,这将需要更多的工作,因为理想情况下,您需要找到最优的颜色映射,在该映射中找到最接近的颜色,并应用抖动以避免条带。为此,我会推荐一些图像处理库。我不认为有任何内置的函数,在这里要演示的工作太多了。

相关内容

  • 没有找到相关文章

最新更新