我正在尝试重新使用一个来自GitHub的例子来处理使用SkiaSharp裁剪图像的问题。具体来说,我有一个4096x4096雪碧表,我想从中提取一个子图像(如果你愿意的话,一个特定的精灵)。为此,我使用以下代码段(其中spriteContent是PNG图像-byte[]的字节数组):
var gch = GCHandle.Alloc(spriteContent, GCHandleType.Pinned);
try
{
var addr = gch.AddrOfPinnedObject();
using var pixmap = new SkiaSharp.SKPixmap(info, addr);
SkiaSharp.SKRectI rectI = new SkiaSharp.SKRectI(0, 0, 256, 256);
var subset = pixmap.ExtractSubset(rectI);
using var data = subset.Encode(SkiaSharp.SKPngEncoderOptions.Default)
File.WriteAllBytes("test2.png", data.ToArray());
}
finally
{
gch.Free();
}然而,这段代码的输出是这样的图像:

似乎是个奇怪的输出。我怀疑我是在做一些有趣的事情,在SKRectI声明中,真正的矩形从未被使用过。我理解它所做的是从顶部的0,底部的0,256像素的高,256像素宽(即管理选择)创建一个矩形。如果我把这个调整到,让我们说:
SkiaSharp.SKRectI rectI = new SkiaSharp.SKRectI(256, 256, 256, 256);我得到一个NullReferenceException,子集中没有任何内容,所以我肯定误解了矩形选择器是如何工作的。
对我可能做错了什么有什么想法吗?
发布于 2022-11-28 10:04:24
您所得到的噪音是由这样一个事实引起的,即您将原始编码的png字节重新解释为像素数据。您需要首先解码图像:
using var skBitmap = SKBitmap.Decode(spriteContent);
using var pixmap = new SKPixmap(skBitmap.Info, skBitmap.GetPixels());
SkiaSharp.SKRectI rectI = new SkiaSharp.SKRectI(0, 0, 256, 256);
var subset = pixmap.ExtractSubset(rectI);
using var data = subset.Encode(SkiaSharp.SKPngEncoderOptions.Default);
File.WriteAllBytes(@"test2.png", data.ToArray());https://stackoverflow.com/questions/74216749
复制相似问题