上一節我們利用Scroller實現了列表項的自動滾動功能,對于圖像列表來說,被選做封面的圖像需要保存為圖片文件,以便向服務器上傳封面圖片。
由于avImageGenerator從視頻提取的圖像幀數據為image.PixelMap(位圖格式),因此前面的圖像轉存操作就變成了把位圖數據寫入圖片文件。那么根據沙箱文件的操作規范,可將完整的圖片轉存過程劃分為下列三個步驟:
一、在沙箱目錄下創建新文件并打開該文件
鴻蒙把文件操作能力封裝到了Core File Kit(文件基礎服務),并通過fileIo工具來調用文件操作函數。為此要在代碼開頭添加下面的導包語句,表示引入文件操作工具fileIo:
import { fileIo } from '@kit.CoreFileKit';
鴻蒙把創建文件和打開文件合并到了一起,調用open函數或者openSync函數,即可實現創建并打開文件的功能。注意,在調用open或者openSync的時候,模式參數要填“fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE”,表示指定路徑若不存在文件就創建新文件,若已存在文件就打開原文件。示例代碼如下:
let dstFile = fileIo.openSync(this.imagePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
二、把位圖數據打包寫入第一步驟的新文件
鴻蒙把圖片處理能力封裝到了Image Kit(圖片處理服務),并通過image工具來調用圖片處理函數。image工具又包含下列常見的子工具:
(1)ImageSource類,提供獲取圖片信息、將圖片解碼為PixelMap或Picture、讀取和修改圖片屬性的能力。支持解碼的圖片格式包括png、jpeg、bmp、gif、webp、dng、heic。
(2)ImagePacker類,提供將圖片編碼為壓縮后的數據流或文件的能力。編碼前需獲取圖片的ImageSource、PixelMap或Picture作為輸入。支持編碼的圖片格式包括jpeg、webp、png、heic、gif。
(3)PixelMap類,位圖對象,包含像素數據以及圖片信息。可用于讀取或寫入像素數據,進行裁剪、縮放、平移、旋轉、鏡像等操作,并可直接傳給Image組件用于顯示。
可見位圖數據屬于PixelMap類,而位圖數據的轉存功能則由ImagePacker類實現,調用image工具的createImagePacker方法,即可獲得ImagePacker類的對象實例。接著調用ImagePacker實例的packToFile,即可將位圖數據寫入指定句柄的文件中。示例代碼如下:
imagePackerApi.packToFile(this.pixelMap, dstFile.fd, packOpts, (err: BusinessError) => {/* 這里可補充位圖轉存完成之后的其他操作 */if (err) { /* 打印失敗日志 */ } else { /* 打印成功日志 */ }
})
三、寫入完畢,關閉第一步打開的圖片文件
調用fileIo工具的close函數或者closeSync函數,即可實現關閉文件的功能。示例代碼如下:
fileIo.closeSync(dstFile);
綜合上述三個步驟,可編寫位圖數據轉存為圖片文件的代碼框架如下所示:
// 保存封面圖片
saveCover() {let videoFileName = this.videoPath.toString().split('/').pop() as stringlet imageFileName = (videoFileName.split('.'))[0] + '_' + this.coverPos + '.jpeg'this.imagePath = `${this.context.cacheDir}/${imageFileName}`let dstFile = fileIo.openSync(this.imagePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);// 轉存為圖片let imagePackerApi: image.ImagePacker = image.createImagePacker();let packOpts: image.PackingOption = { format: 'image/jpeg', quality: 90 };imagePackerApi.packToFile(this.pixelMap, dstFile.fd, packOpts, (err: BusinessError) => {fileIo.closeSync(dstFile);if (err) { /* 打印失敗日志 */ } else { /* 打印成功日志 */ }})
}
下一篇文章會介紹如何把相冊中的視頻復制到沙箱目錄。