SkiaSharp 把 pixel byte[] 转成 SKBitmap
关键方法
/// <summary>
/// 把像素字节数组转图片
/// </summary>
/// <param name="buffer">像素数组,例如: [r, g, b, a, r, g, b, a ...]</param>
/// <param name="width">图片的宽度,例如: 512</param>
/// <param name="height">图片的高度,例如: 1024</param>
/// <param name="format">指定像素数组的组成方式,例如:SKColorType.Rgba8888</param>
/// <returns></returns>
public static SKBitmap Decode(byte[] buffer, int width, int height, SKColorType format)
{
var data = SKData.CreateCopy(buffer);
var newInfo = new SKImageInfo(width, height, format);
var bitmap = new SKBitmap();
bitmap.InstallPixels(newInfo, data.Data);
return bitmap;
}
public static SKImage Decode(byte[] buffer, int width, int height, SKColorType format)
{
var newInfo = new SKImageInfo(width, height, format);
var data = SKData.CreateCopy(buffer);
return SKImage.FromPixels(newInfo, data);
}
解密不知的图片格式
SkiaSharp
默认支持 png
jpg
等文件格式,但是一些不支持的文件格式怎么显示呢?
例如:pvr
格式就不能直接解码。
- 第一步,先解析 pvr 文件,获取 pvr 文件头得到:图片的宽高,编码方式,数据开始的开始的位置
- 读取内容数据
- 判断 编码方式 是否被
SkiaSharp
支持,所有支持的颜色编码方式在SKColorType
中 - 不支持的编码方式,需要先转成支持的,例如转成
SKColorType.Rgba8888
, 即:每个像素占四个字节,分别为 [Red,Green,Blue,Alpha],总字节为宽*高*4
, 以逐行横行存储,(行*宽+列)*4
获取像素点的位置 - 调用上述方法
Decode(转换后的数据, 宽, 高, SKColorType.Rgba8888)
即可
可能出现的问题
Q: Attempted to read or write protected memory
A: SkiaSharp 是线程安全的,两个线程不应访问同一个对象。SKBitmap 只能在UI主线程中操作,SKImage 则可以在所有子线程中操作
转载请保留原文链接: https://www.zodream.cn/blog/id/265.html