我试图将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);
}发布于 2021-10-29 08:54:53
这展示了如何手动进行转换。它需要对图像数据进行direct pointer access。因此,只需为转换目标创建一个具有正确大小的新的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的颜色索引,这将是更多的工作,因为你理想情况下需要找到一个最佳的颜色映射,在所述映射中找到最接近的颜色,并应用抖动来避免条带。为此,我推荐一些图像处理库。我不认为有任何内置的函数可以做到这一点,而且在这里需要做很多工作来演示。
https://stackoverflow.com/questions/69750844
复制相似问题