`SkiaSharp.SKBitmap` 中的 `InstallPixels()` 和 `SetPixels()` 有什么区别?

What is the difference between `InstallPixels()` and `SetPixels()` in `SkiaSharp.SKBitmap`?

我不清楚 SKBitmap.InstallPixels()SKBitmap.SetPixels() 是如何工作的。这是每个方法之一的文档(有几个方法重载):

// Summary:
//     Installs the specified pixels into the bitmap.
//
// Parameters:
//   info:
//     The image information describing the pixels.
//
//   pixels:
//     The pixels to install.
//
// Returns:
//     Returns true on success, or false on failure. If there was an error, the bitmap
//     will be set to empty.
public bool InstallPixels(SKImageInfo info, IntPtr pixels);

// Summary:
//     Replaces the current pixel address for the bitmap.
//
// Parameters:
//   pixels:
//     The new pixel address.
public void SetPixels(IntPtr pixels);

我的猜测是 InstallPixels() 将数据从 IntPtr 复制到本地字节数组,而 SetPixels() 使传递的 IntPtr 成为要使用的字节数组。

如果我的假设是正确的,那是否意味着如果我想使用 InstallPixels() 我需要先调用 TryAllocPixels() 来创建内部字节数组?如果我想使用 SetPixels(),我需要手动处理字节数组还是在处理 SKBitmap 时处理字节数组?

installpixles 第一次将像素安装到位图中 setpixles 将已安装的像素设置为新值

所以,这可能已经晚了两年,无法发挥作用,但我发现这个问题再次出现在我的搜索中,所以我会提供一个答案,希望它对某人有用。

  • InstallPixels完全可以改变形象。它以单独的 SkImageInfo 和指向像素数组的指针作为参数,或者将图像信息和像素数组指针捆绑在一起的 SkPixmap 作为参数。因为它可以更新图像信息,InstallPixels 可用于更改图像的大小、像素格式或颜色 space。您可以在使用 new SkBitmap().

    创建的空图像上自由使用 InstallPixels

    InstallPixels 还可以选择接受一个委托,该委托将在处理位图时在提供的像素数组指针上调用。这可用于执行诸如取消固定数组、释放 GC 句柄、释放 non-GC 堆上的内存等操作。这使您可以将内存缓冲区的所有权传递给 SkBitmap 实例,而不必担心保持它的活动状态或自己清理它。

  • 相比之下,SetPixels一个指向像素数组的指针。您无法更改位图的大小、像素格式或颜色 space,因此 pointed-to 数组应与您正在修改的位图具有相同的大小和布局。

    SetPixels 不接受发布委托。这意味着保持 pointed-to 像素在位图的生命周期内有效,然后在不再需要时整理它们(例如通过取消固定、释放 GC 句柄或释放 non-GC 内存)的责任仍然由 你的代码。

一般情况下,我怀疑InstallPixels可能是你想要使用的方法。 SetPixels 只能做 InstallPixels 能做的一部分,并且需要您自己处理内存和生命周期问题。