HarmonyOS之深入解析图像的位图操作和属性解码

Posted Forever_wj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HarmonyOS之深入解析图像的位图操作和属性解码相关的知识,希望对你有一定的参考价值。

一、位图操作

① 应用场景
  • 位图操作就是指对 PixelMap 图像进行相关的操作,比如创建、查询信息、读写像素数据等。
② 位图操作 API
  • 位图操作类 PixelMap 的主要接口:
接口名描述
create(InitializationOptions opts)根据图像大小、像素格式、alpha类型等初始化选项创建PixelMap
create(int[] colors, InitializationOptions opts)根据图像大小、像素格式、alpha类型等初始化选项,以像素颜色数组为数据源创建PixelMap
create(int[] colors, int offset, int stride, InitializationOptions opts)根据图像大小、像素格式、alpha类型等初始化选项,以像素颜色数组、起始偏移量、行像素大小描述的数据源创建PixelMap
create(PixelMap source, InitializationOptions opts)根据图像大小、像素格式、alpha类型等初始化选项,以源PixelMap为数据源创建PixelMap
create(PixelMap source, Rect srcRegion, InitializationOptions opts)根据图像大小、像素格式、alpha类型等初始化选项,以源PixelMap、源裁剪区域描述的数据源创建PixelMap
getBytesNumberPerRow()获取每行像素数据占用的字节数
getPixelBytesCapacity()获取存储Pixelmap像素数据的内存容量
isEditable()判断PixelMap是否允许修改
isSameImage(PixelMap other)判断两个图像是否相同,包括ImageInfo属性信息和像素数据
readPixel(Position pos)读取指定位置像素的颜色值,返回的颜色格式为PixelFormat.ARGB_8888
readPixels(int[] pixels, int offset, int stride, Rect region)读取指定区域像素的颜色值,输出到以起始偏移量、行像素大小描述的像素数组,返回的颜色格式为PixelFormat.ARGB_8888
readPixels(Buffer dst)读取像素的颜色值到缓冲区,返回的数据是PixelMap中像素数据的原样拷贝,即返回的颜色数据格式与PixelMap中像素格式一致
resetConfig(Size size, PixelFormat pixelFormat)重置PixelMap的大小和像素格式配置,但不会改变原有的像素数据也不会重新分配像素数据的内存,重置后图像数据的字节数不能超过PixelMap的内存容量
setAlphaType(AlphaType alphaType)设置PixelMap的Alpha类型
writePixel(Position pos, int color)向指定位置像素写入颜色值,写入颜色格式为PixelFormat.ARGB_8888
writePixels(int[] pixels, int offset, int stride, Rect region)将像素颜色数组、起始偏移量、行像素的个数描述的源像素数据写入PixelMap的指定区域,写入颜色格式为PixelFormat.ARGB_8888
writePixels(Buffer src)将缓冲区描述的源像素数据写入PixelMap,写入的数据将原样覆盖PixelMap中的像素数据,即写入数据的颜色格式应与PixelMap的配置兼容
writePixels(int color)将所有像素都填充为指定的颜色值,写入颜色格式为 PixelFormat.ARGB_8888
getPixelBytesNumber()获取全部像素数据包含的字节数
setBaseDensity(int baseDensity)设置PixelMap的基础像素密度值
getBaseDensity()获取PixelMap的基础像素密度值
setUseMipmap(boolean useMipmap)设置PixelMap渲染是否使用mipmap
useMipmap()获取PixelMap渲染是否使用mipmap
getNinePatchChunk()获取图像的NinePatchChunk数据
getFitDensitySize(int targetDensity)获取适应目标像素密度的图像缩放的尺寸
getImageInfo()获取图像基本信息
release()释放对象关联的本地资源
③ 位图操作流程
  • 创建位图对象 PixelMap:
	// 从像素颜色数组创建
	int[] defaultColors = new int[] {5, 5, 5, 5, 6, 6, 3, 3, 3, 0};
	PixelMap.InitializationOptions initializationOptions = new PixelMap.InitializationOptions();
	initializationOptions.size = new Size(3, 2);
	initializationOptions.pixelFormat = PixelFormat.ARGB_8888;
	initializationOptions.editable = true;
	PixelMap pixelMap1 = PixelMap.create(defaultColors, initializationOptions);
	
	// 指定初始化选项创建
	PixelMap pixelMap2 = PixelMap.create(initializationOptions);
	
	// 以另外一个PixelMap作为数据源创建
	PixelMap pixelMap3 = PixelMap.create(pixelMap2, initializationOptions);
  • 从位图对象中获取信息:
	long capacity = pixelMap.getPixelBytesCapacity();
	long bytesNumber = pixelMap.getPixelBytesNumber();
	int rowBytes = pixelMap.getBytesNumberPerRow();
	byte[] ninePatchData = pixelMap.getNinePatchChunk();
  • 读写位图像素数据:
	// 读取指定位置像素
	int color = pixelMap.readPixel(new Position(1, 1));
	
	// 读取指定区域像素
	int[] pixelArray = new int[50];
	Rect region = new Rect(0, 0, 10, 5);
	pixelMap.readPixels(pixelArray, 0, 10, region);
	
	// 读取像素到Buffer
	IntBuffer pixelBuf = IntBuffer.allocate(50);
	pixelMap.readPixels(pixelBuf);
	
	// 在指定位置写入像素
	pixelMap.writePixel(new Position(1, 1), 0xFF112233);
	
	// 在指定区域写入像素
	pixelMap.writePixels(pixelArray, 0, 10, region);
	
	// 写入Buffer中的像素
	pixelMap.writePixels(intBuf);

二、图像属性解码

① 应用场景
  • 图像属性解码就是获取图像中包含的属性信息,比如 EXIF 属性。
② 属性解码 API
  • 图像属性解码的功能主要由 ImageSource 和 ExifUtils 提供。
  • ImageSource 的主要接口:
接口名描述
getThumbnailInfo()获取嵌入图像文件的缩略图的基本信息
getImageThumbnailBytes()获取嵌入图像文件缩略图的原始数据
getThumbnailFormat()获取嵌入图像文件缩略图的格式
  • ExifUtils 的主要接口:
接口名描述
getLatLong(ImageSource imageSource)获取嵌入图像文件的经纬度信息
getAltitude(ImageSource imageSource, double defaultValue)获取嵌入图像文件的海拔信息
③ 属性解码流程
  • 创建图像数据源 ImageSource 对象,可以通过 SourceOptions 指定数据源的格式信息,此格式信息仅为给解码器的提示,正确提供能帮助提高解码效率,如果不设置或设置不正确,会自动检测正确的图像格式。
	ImageSource.SourceOptions srcOpts = new ImageSource.SourceOptions();
	srcOpts.formatHint = "image/jpeg";
	String pathName = "/sdcard/image.jpg";
	ImageSource imageSource = ImageSource.create(pathName, srcOpts);
  • 获取缩略图信息:
	int format = imageSource.getThumbnailFormat();
	byte[] thumbnailBytes = imageSource.getImageThumbnailBytes();
	
	// 将缩略图解码为PixelMap对象
	ImageSource.DecodingOptions decodingOpts = new ImageSource.DecodingOptions();
	PixelMap thumbnailPixelmap = imageSource.createThumbnailPixelmap(decodingOpts, false);

以上是关于HarmonyOS之深入解析图像的位图操作和属性解码的主要内容,如果未能解决你的问题,请参考以下文章

HarmonyOS之深入解析媒体数据的管理与操作

HarmonyOS之深入解析视频的功能和使用

HarmonyOS之深入解析相机的功能和使用

HarmonyOS之深入解析通知的使用

HarmonyOS之深入解析线程间的通信

HarmonyOS之深入解析线程管理