生活随笔
收集整理的這篇文章主要介紹了
HarmonyOS之深入解析图像的位图操作和属性解码
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、位圖操作
① 應(yīng)用場(chǎng)景
- 位圖操作就是指對(duì) PixelMap 圖像進(jìn)行相關(guān)的操作,比如創(chuàng)建、查詢信息、讀寫(xiě)像素?cái)?shù)據(jù)等。
② 位圖操作 API
- 位圖操作類(lèi) PixelMap 的主要接口:
接口名描述
| create(InitializationOptions opts) | 根據(jù)圖像大小、像素格式、alpha類(lèi)型等初始化選項(xiàng)創(chuàng)建PixelMap |
| create(int[] colors, InitializationOptions opts) | 根據(jù)圖像大小、像素格式、alpha類(lèi)型等初始化選項(xiàng),以像素顏色數(shù)組為數(shù)據(jù)源創(chuàng)建PixelMap |
| create(int[] colors, int offset, int stride, InitializationOptions opts) | 根據(jù)圖像大小、像素格式、alpha類(lèi)型等初始化選項(xiàng),以像素顏色數(shù)組、起始偏移量、行像素大小描述的數(shù)據(jù)源創(chuàng)建PixelMap |
| create(PixelMap source, InitializationOptions opts) | 根據(jù)圖像大小、像素格式、alpha類(lèi)型等初始化選項(xiàng),以源PixelMap為數(shù)據(jù)源創(chuàng)建PixelMap |
| create(PixelMap source, Rect srcRegion, InitializationOptions opts) | 根據(jù)圖像大小、像素格式、alpha類(lèi)型等初始化選項(xiàng),以源PixelMap、源裁剪區(qū)域描述的數(shù)據(jù)源創(chuàng)建PixelMap |
| getBytesNumberPerRow() | 獲取每行像素?cái)?shù)據(jù)占用的字節(jié)數(shù) |
| getPixelBytesCapacity() | 獲取存儲(chǔ)Pixelmap像素?cái)?shù)據(jù)的內(nèi)存容量 |
| isEditable() | 判斷PixelMap是否允許修改 |
| isSameImage(PixelMap other) | 判斷兩個(gè)圖像是否相同,包括ImageInfo屬性信息和像素?cái)?shù)據(jù) |
| readPixel(Position pos) | 讀取指定位置像素的顏色值,返回的顏色格式為PixelFormat.ARGB_8888 |
| readPixels(int[] pixels, int offset, int stride, Rect region) | 讀取指定區(qū)域像素的顏色值,輸出到以起始偏移量、行像素大小描述的像素?cái)?shù)組,返回的顏色格式為PixelFormat.ARGB_8888 |
| readPixels(Buffer dst) | 讀取像素的顏色值到緩沖區(qū),返回的數(shù)據(jù)是PixelMap中像素?cái)?shù)據(jù)的原樣拷貝,即返回的顏色數(shù)據(jù)格式與PixelMap中像素格式一致 |
| resetConfig(Size size, PixelFormat pixelFormat) | 重置PixelMap的大小和像素格式配置,但不會(huì)改變?cè)械南袼財(cái)?shù)據(jù)也不會(huì)重新分配像素?cái)?shù)據(jù)的內(nèi)存,重置后圖像數(shù)據(jù)的字節(jié)數(shù)不能超過(guò)PixelMap的內(nèi)存容量 |
| setAlphaType(AlphaType alphaType) | 設(shè)置PixelMap的Alpha類(lèi)型 |
| writePixel(Position pos, int color) | 向指定位置像素寫(xiě)入顏色值,寫(xiě)入顏色格式為PixelFormat.ARGB_8888 |
| writePixels(int[] pixels, int offset, int stride, Rect region) | 將像素顏色數(shù)組、起始偏移量、行像素的個(gè)數(shù)描述的源像素?cái)?shù)據(jù)寫(xiě)入PixelMap的指定區(qū)域,寫(xiě)入顏色格式為PixelFormat.ARGB_8888 |
| writePixels(Buffer src) | 將緩沖區(qū)描述的源像素?cái)?shù)據(jù)寫(xiě)入PixelMap,寫(xiě)入的數(shù)據(jù)將原樣覆蓋PixelMap中的像素?cái)?shù)據(jù),即寫(xiě)入數(shù)據(jù)的顏色格式應(yīng)與PixelMap的配置兼容 |
| writePixels(int color) | 將所有像素都填充為指定的顏色值,寫(xiě)入顏色格式為 PixelFormat.ARGB_8888 |
| getPixelBytesNumber() | 獲取全部像素?cái)?shù)據(jù)包含的字節(jié)數(shù) |
| setBaseDensity(int baseDensity) | 設(shè)置PixelMap的基礎(chǔ)像素密度值 |
| getBaseDensity() | 獲取PixelMap的基礎(chǔ)像素密度值 |
| setUseMipmap(boolean useMipmap) | 設(shè)置PixelMap渲染是否使用mipmap |
| useMipmap() | 獲取PixelMap渲染是否使用mipmap |
| getNinePatchChunk() | 獲取圖像的NinePatchChunk數(shù)據(jù) |
| getFitDensitySize(int targetDensity) | 獲取適應(yīng)目標(biāo)像素密度的圖像縮放的尺寸 |
| getImageInfo() | 獲取圖像基本信息 |
| release() | 釋放對(duì)象關(guān)聯(lián)的本地資源 |
③ 位圖操作流程
- 創(chuàng)建位圖對(duì)象 PixelMap:
// 從像素顏色數(shù)組創(chuàng)建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);// 指定初始化選項(xiàng)創(chuàng)建PixelMap pixelMap2 = PixelMap.create(initializationOptions);// 以另外一個(gè)PixelMap作為數(shù)據(jù)源創(chuàng)建PixelMap pixelMap3 = PixelMap.create(pixelMap2, initializationOptions);
long capacity = pixelMap.getPixelBytesCapacity();long bytesNumber = pixelMap.getPixelBytesNumber();int rowBytes = pixelMap.getBytesNumberPerRow();byte[] ninePatchData = pixelMap.getNinePatchChunk();
- 讀寫(xiě)位圖像素?cái)?shù)據(jù):
// 讀取指定位置像素int color = pixelMap.readPixel(new Position(1, 1));// 讀取指定區(qū)域像素int[] pixelArray = new int[50];Rect region = new Rect(0, 0, 10, 5);pixelMap.readPixels(pixelArray, 0, 10, region);// 讀取像素到BufferIntBuffer pixelBuf = IntBuffer.allocate(50);pixelMap.readPixels(pixelBuf);// 在指定位置寫(xiě)入像素pixelMap.writePixel(new Position(1, 1), 0xFF112233);// 在指定區(qū)域?qū)懭胂袼豴ixelMap.writePixels(pixelArray, 0, 10, region);// 寫(xiě)入Buffer中的像素pixelMap.writePixels(intBuf);
二、圖像屬性解碼
① 應(yīng)用場(chǎng)景
- 圖像屬性解碼就是獲取圖像中包含的屬性信息,比如 EXIF 屬性。
② 屬性解碼 API
- 圖像屬性解碼的功能主要由 ImageSource 和 ExifUtils 提供。
- ImageSource 的主要接口:
接口名描述
| getThumbnailInfo() | 獲取嵌入圖像文件的縮略圖的基本信息 |
| getImageThumbnailBytes() | 獲取嵌入圖像文件縮略圖的原始數(shù)據(jù) |
| getThumbnailFormat() | 獲取嵌入圖像文件縮略圖的格式 |
接口名描述
| getLatLong(ImageSource imageSource) | 獲取嵌入圖像文件的經(jīng)緯度信息 |
| getAltitude(ImageSource imageSource, double defaultValue) | 獲取嵌入圖像文件的海拔信息 |
③ 屬性解碼流程
- 創(chuàng)建圖像數(shù)據(jù)源 ImageSource 對(duì)象,可以通過(guò) SourceOptions 指定數(shù)據(jù)源的格式信息,此格式信息僅為給解碼器的提示,正確提供能幫助提高解碼效率,如果不設(shè)置或設(shè)置不正確,會(huì)自動(dòng)檢測(cè)正確的圖像格式。
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對(duì)象ImageSource.DecodingOptions decodingOpts = new ImageSource.DecodingOptions();PixelMap thumbnailPixelmap = imageSource.createThumbnailPixelmap(decodingOpts, false);
總結(jié)
以上是生活随笔為你收集整理的HarmonyOS之深入解析图像的位图操作和属性解码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。