簡體   English   中英

使用 SkiaSharp 提取圖像子集(裁剪)

[英]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是這樣的圖像:

格式錯誤的 PNG 圖像

似乎是一個奇怪的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM