`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
能做的一部分,并且需要您自己处理内存和生命周期问题。
我不清楚 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
能做的一部分,并且需要您自己处理内存和生命周期问题。