[英]Extracting image subset (cropping) with SkiaSharp
我正在嘗試重新使用 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();
}
然而,這段代碼的output是這樣的圖像:
似乎是一個奇怪的 output。我懷疑我正在用SKRectI
聲明做一些時髦的事情,其中從未使用過真正的矩形。 我理解它要做的是從頂部的點 0、底部的 0、256 像素高、256 像素寬創建一個矩形(即管理選擇)。 如果我將其調整為,讓我們說:
SkiaSharp.SKRectI rectI = new SkiaSharp.SKRectI(256, 256, 256, 256);
我得到一個NullReferenceException
並且子集中沒有任何內容,所以我一定是誤解了矩形選擇器的工作方式。
關於我在這里可能做錯了什么的任何想法?
您得到的噪音是由於您將原始編碼的 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());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.