鴻蒙NEXT開發筆記(二十八)仿抖音快手App的把位圖數據轉存為圖片

上一節我們利用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 { /* 打印成功日志 */ }})
}

下一篇文章會介紹如何把相冊中的視頻復制到沙箱目錄。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91272.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91272.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91272.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

四、搭建springCloudAlibaba2021.1版本分布式微服務-加入openFeign遠程調用和sentinel流量控制

OpenFeign遠程調用 1、OpenFeign OpenFeign是一種聲明式、模板化的HTTP客戶端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP請求訪問遠程服務,就像調用本地方法一樣的,開發者完全感知不到這是在調用遠程方法,更感知不到在訪問…

網絡安全威脅——APT攻擊_apt攻擊預測案例

APT攻擊 1. 基本概念2. APT的攻擊階段3. APT的典型案例參考 1. 基本概念 高級持續性威脅(APT,Advanced Persistent Threat),又叫高級長期威脅,是一種復雜的、持續的網絡攻擊,包含高級、長期、威脅三個要…

順時針旋轉N * N 的矩陣

順時針旋轉題目描述數據范圍實現邏輯代碼實現題目描述 有一個NxN整數矩陣&#xff0c;請編寫一個算法&#xff0c;將矩陣順時針旋轉90度。給定一個NxN的矩陣&#xff0c;和矩陣的階數N,請返回旋轉后的NxN矩陣。數據范圍 0<n<300&#xff0c;矩陣中的值滿足 0≤val≤100…

原生C++實現信號與槽機制:原理詳解

信號與槽機制是一種廣泛應用于事件驅動系統和GUI框架&#xff08;如Qt&#xff09;的設計模式。它允許組件之間通過訂閱-發布模式進行通信&#xff0c;從而實現松耦合的設計。本文將詳細講解如何在原生C中從零開始實現信號與槽機制&#xff0c;并深入探討其工作原理。一、信號與…

【人工智能】OpenAI的AI代理革命:通向超擬人交互的未來之路

人工智能代理(AI Agent)正引領一場深刻的技術變革,其核心在于賦予AI系統感知、規劃、行動和學習的能力,以自主完成復雜任務。OpenAI作為這一領域的先驅,通過其大型語言模型(LLMs)如GPT系列,極大地推動了AI代理的發展,使其在自然語言理解、生成和工具使用方面達到了前所…

Ubuntu虛擬機介紹、命令、安裝軟件指令(一)

Ubuntu介紹 Ubuntu 是一個基于 Debian 的開源 Linux 操作系統&#xff0c;由 Canonical 公司贊助開發。它是目前全球最流行的 Linux 發行版之一&#xff0c;以其用戶友好性、穩定性和強大的社區支持著稱。 核心特性 1.免費開源 完全免費使用和分發&#xff0c;遵循 GNU GPL…

企業微信服務商創建第三方應用配置數據回調url和指令回調url的java代碼實現

關鍵區別說明&#xff08;指令回調 vs 數據回調&#xff09;特性指令回調數據回調觸發場景授權/取消授權等管理事件通訊錄變更、應用菜單點擊等業務事件關鍵字段InfoTypeEvent ChangeType典型事件suite_auth, cancel_authchange_contact, suite_ticket響應要求必須返回加密的&…

LazyLLM教程 | 第2講:10分鐘上手一個最小可用RAG系統

貼心小梗概本文將介紹使用LazyLLM搭建最基礎的RAG的流程。首先介紹使用LazyLLM搭建RAG系統的必要環境配置&#xff0c;然后簡單回顧RAG的基本流程&#xff0c;接下來分別介紹RAG中文檔加載、檢索組件、生成組件三個關鍵部分的參數和基本使用方法&#xff0c;最后利用LazyLLM實現…

android9-PMS-常見問題及分析步驟

以下是基于 Android 9 的 Package Manager Service (PMS) 常見問題及分析步驟&#xff0c;結合系統原理與優化實踐整理&#xff1a; &#x1f527; 一、開機性能問題 現象 開機時間隨應用增多顯著延長&#xff0c;卡在“正在啟動應用”階段。 分析步驟 ① 確認掃描階段耗時adb…

生成模型實戰 | GLOW詳解與實現

生成模型實戰 | GLOW詳解與實現0. 前言1. 歸一化流模型1.1 歸一化流與變換公式1.2 RealNVP 的通道翻轉2. GLOW 架構2.1 ActNorm2.2 可逆 11 卷積2.3 仿射耦合層2.4 多尺度架構3. 使用 PyTorch 實現 GLOW3.1 數據處理3.2 模型構建3.3 模型訓練0. 前言 GLOW (Generative Flow) 是…

行業案例:杰和科技為智慧教育構建數字化硬件底座

清晨8點10分&#xff0c;深圳某學生踏入校園&#xff0c;智慧門閘識別身份&#xff0c;并同步發給家長&#xff1b;走廊里的“智慧班牌”向他們展示今日的課表&#xff1b;課堂上&#xff0c;教室前方的多媒體播放器里&#xff0c;老師引導學生學習“居民樓消防隱患”知識&…

Redis與MySQL數據同步:從“雙寫一致性”到實戰方案

Redis與MySQL數據同步&#xff1a;從“雙寫一致性”到實戰方案 在分布式系統中&#xff0c;Redis作為高性能緩存被廣泛使用——它能將熱點數據從MySQL中“搬運”到內存&#xff0c;大幅降低數據庫壓力、提升接口響應速度。但隨之而來的核心問題是&#xff1a;當MySQL數據更新時…

Java源碼構建智能名片小程序

在移動互聯網時代&#xff0c;紙質名片的局限性日益凸顯——信息更新不便、客戶管理困難、營銷效果難以追蹤。智能電子名片小程序以其便捷、高效、智能的特點&#xff0c;正成為商務人士的"數字營銷門戶"。而基于Java技術棧開發的智能名片系統&#xff0c;憑借其穩定…

如何在短時間內顯著提升3D效果圖渲染速度?

在建筑設計、游戲開發、影視制作等行業&#xff0c;3D效果圖的渲染速度是項目進度與效率的關鍵瓶頸。面對復雜場景時&#xff0c;漫長的渲染等待尤為突出。要在保證質量的前提下大幅縮短渲染時間&#xff0c;以下優化策略至關重要&#xff1a; 1. 升級硬件配置&#xff1a;渲染…

配置daemon.json使得 Docker 容器能夠使用服務器GPU【驗證成功】

&#x1f947; 版權: 本文由【墨理學AI】原創首發、各位讀者大大、敬請查閱、感謝三連 文章目錄&#x1f50d;你遇到的錯誤&#xff1a;&#x1f50d; 根本原因? 解決方案&#xff1a;正確安裝 NVIDIA Container Toolkit? 第一步&#xff1a;卸載舊版本&#xff08;如果存在&…

Linux 系統進程管理與計劃任務詳解

Linux 系統進程管理與計劃任務詳解 一、程序與進程的基本概念 程序&#xff1a;保存在外部存儲介質中的可執行機器代碼和數據的靜態集合。進程&#xff1a;在CPU及內存中處于動態執行狀態的計算機程序。關系&#xff1a;每個程序啟動后&#xff0c;可創建一個或多個進程。 二、…

【圖像處理】直方圖均衡化c++實現

直方圖均衡化是一種通過調整圖像像素灰度值分布&#xff0c;來增強圖像對比度的經典數字圖像處理技術。其核心在于將原始圖像的灰度直方圖從集中的某個區間“拉伸”或“均衡”到更廣泛的區間&#xff0c;讓圖像的明暗細節更清晰&#xff0c;關鍵在于利用累積分布函數實現灰度值…

Web前端實戰:Vue工程化+ElementPlus

1.Vue工程化 1.1介紹 模塊化&#xff1a;將js和css等&#xff0c;做成一個個可復用模塊組件化&#xff1a;我們將UI組件&#xff0c;css樣式&#xff0c;js行為封裝成一個個的組件&#xff0c;便于管理規范化&#xff1a;我們提供一套標準的規范的目錄接口和編碼規范&#xff0…

ECMAScript2021(ES12)新特性

概述 ECMAScript2021于2021年6月正式發布&#xff0c; 本文會介紹ECMAScript2021(ES12)&#xff0c;即ECMAScript的第12個版本的新特性。 以下摘自官網&#xff1a;ecma-262 ECMAScript 2021, the 12th edition, introduced the replaceAll method for Strings; Promise.any,…

Tlias 案例-整體布局(前端)

開發流程前端開發和后端開發是一樣的&#xff0c;都需要閱讀接口文檔。 準備工作&#xff1a; 1&#xff1a;導入項目中準備的基礎過程到 VsCode。2&#xff1a;啟動前端項目&#xff0c;訪問該項目3&#xff1a;熟悉一下基本的布局<script setup></script><tem…