首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用SkiaSharp提取图像子集(裁剪)

用SkiaSharp提取图像子集(裁剪)
EN

Stack Overflow用户
提问于 2022-10-27 04:15:27
回答 1查看 56关注 0票数 1

我正在尝试重新使用一个来自GitHub的例子来处理使用SkiaSharp裁剪图像的问题。具体来说,我有一个4096x4096雪碧表,我想从中提取一个子图像(如果你愿意的话,一个特定的精灵)。为此,我使用以下代码段(其中spriteContent是PNG图像-byte[]的字节数组):

代码语言:javascript
复制
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像素宽(即管理选择)创建一个矩形。如果我把这个调整到,让我们说:

代码语言:javascript
复制
SkiaSharp.SKRectI rectI = new SkiaSharp.SKRectI(256, 256, 256, 256);

我得到一个NullReferenceException,子集中没有任何内容,所以我肯定误解了矩形选择器是如何工作的。

对我可能做错了什么有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-28 10:04:24

您所得到的噪音是由这样一个事实引起的,即您将原始编码的png字节重新解释为像素数据。您需要首先解码图像:

代码语言:javascript
复制
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());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74216749

复制
相关文章

相似问题

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