news 2026/8/1 2:03:48

PixelMap 编辑原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PixelMap 编辑原理

2.1 什么是 PixelMap

在 HarmonyOS NEXT 中,PixelMap 是所有图片处理的核心对象

很多开发者第一次接触图片开发时,认为:

图片 = jpg/png 文件

实际上并不是。

JPG、PNG、WebP 都只是磁盘上的文件格式

例如:

photo.jpg

它在磁盘里面保存的是:

压缩数据

而不是:

RGB RGB RGB RGB...

图片真正能够被屏幕显示之前,需要经过一次完整的解码流程。

整个流程如下:

photo.jpg │ ▼ ImageSource │ ▼ JPEG 解码 │ ▼ RGBA 像素数据 │ ▼ PixelMap │ ▼ ArkUI Image │ ▼ GPU │ ▼ 屏幕显示

因此:

PixelMap 就是一张图片解码后的像素数据。

所有图片编辑都是围绕 PixelMap 完成。

例如:

微信修改头像:

选择图片 ↓ PixelMap ↓ 裁剪 ↓ 旋转 ↓ 压缩 ↓ 上传

小红书:

相册 ↓ PixelMap ↓ 滤镜 ↓ 贴纸 ↓ 文字 ↓ 保存

美图秀秀:

图片 ↓ PixelMap ↓ 美颜 ↓ AI ↓ 导出

所以可以说:

没有 PixelMap,就没有图片编辑。


2.2 PixelMap 为什么存在?

有人会问:

既然已经有 jpg 文件了。

为什么还需要 PixelMap?

原因很简单。

例如:

我们想修改图片左上角一个像素。

JPG:

FFFFFFFFFFABCD239A... ......

看到什么了吗?

什么也看不到。

因为 JPG 是经过:

  • DCT 离散余弦变换
  • 量化
  • 霍夫曼编码

以后得到的一串压缩数据。

CPU 根本不知道:

第100万个字节 是不是 第100万个像素。

所以必须:

JPG ↓ 解码 ↓ PixelMap ↓ 修改 ↓ 重新编码 ↓ JPG

整个世界所有图片编辑器都是这样工作的。

包括:

  • Photoshop
  • Lightroom
  • 美图秀秀
  • 醒图
  • Snapseed

都是先解码,再编辑。


2.3 PixelMap 内存结构

PixelMap 本质就是:

一块连续申请出来的内存。

例如:

创建:

const pixelMap = await imageSource.createPixelMap()

实际上系统做了下面几件事情:

读取图片 ↓ 申请内存 ↓ JPEG 解码 ↓ 写入内存 ↓ PixelMap 返回

假设:

图片:

1000 × 1000

系统会申请:

1000000 个 Pixel

每一个 Pixel 都紧挨着。

例如:

Pixel0 Pixel1 Pixel2 Pixel3 Pixel4 ...... Pixel999999

连续存放。

这就是为什么:

PixelMap 可以高速访问。

因为:

CPU 最喜欢:

连续内存

而不是:

链表 树 Map

图片处理之所以快,就是因为:

PixelMap 的布局非常适合 CPU Cache。


2.4 PixelMap 的内存布局

PixelMap 默认使用:

RGBA8888

什么意思?

一个 Pixel:

包含:

Red Green Blue Alpha

每一个:

8 bit

所以:

8 + 8 + 8 + 8 = 32bit

即:

4 Byte

一个 Pixel:

内存里面就是:

R G B A

例如:

红色:

255 0 0 255

绿色:

0 255 0 255

蓝色:

0 0 255 255

透明:

255 255 255 0

因此:

PixelMap 真正的数据就是:

255 0 0 255 255 0 0 255 255 0 0 255 0 255 0 255 ...... ......

连续排列。


2.5 一个 Pixel 占多少内存?

RGBA8888:

R 8bit
G 8bit
B 8bit
A 8bit

因此:

4 Byte

假设:

图片:

1920 ×1080

像素:

1920 × 1080 = 2073600

内存:

2073600 × 4 = 8294400 Byte

约等于:

7.91MB

很多人觉得:

图片只有:

2MB

为什么内存:

8MB

原因就在这里。

图片:

2MB

是:

压缩以后。

PixelMap:

8MB

是:

解码以后。

完全不是一个概念。


2.6 为什么一张照片会占几十 MB?

现在手机:

1200 万像素

例如:

4032 ×3024

像素:

12192768

内存:

12192768 × 4 = 48771072

约:

46MB

如果:

5000 万像素:

8192 ×6144

内存:

8192 × 6144 × 4 = 201MB

所以:

为什么:

很多 App:

打开照片:

瞬间:

内存:

上涨:

200MB。

就是因为:

PixelMap 已经解码了。


2.7 PixelMap 生命周期

PixelMap 生命周期可以分成六个阶段。

第一阶段 创建

例如:

const imageSource = image.createImageSource(path)

然后:

const pixelMap = await imageSource.createPixelMap()

系统:

申请内存 ↓ JPEG 解码 ↓ PixelMap

第二阶段 编辑

例如:

旋转 裁剪 缩放 滤镜 文字 水印

全部发生在:

PixelMap

上。


第三阶段 显示

例如:

Image(pixelMap)

ArkUI:

直接:

GPU:

渲染。


第四阶段 保存

例如:

PixelMap ↓ ImagePacker ↓ JPEG ↓ File

保存的时候:

重新编码。


第五阶段 上传

企业项目:

一般:

保存 ↓ OSS ↓ CDN

上传的不再是:

PixelMap。

而是:

JPEG。


第六阶段 释放

例如:

this.pixelMap = undefined

没有引用以后。

GC:

回收。

内存:

释放。


2.8 PixelMap 创建过程源码解析

很多人觉得:

createPixelMap()

只是:

new 一个对象。

实际上:

里面流程远比想象复杂。

createPixelMap() │ ▼ 读取文件 │ ▼ 判断图片格式 │ ▼ JPEG Decoder │ ▼ 申请 RGBA 内存 │ ▼ 颜色空间转换 │ ▼ Alpha 通道处理 │ ▼ 生成 PixelMap

真正耗时的是:

JPEG 解码

而不是:

new PixelMap

因此:

第一次打开:

一般:

几十毫秒。

大图:

几百毫秒。

都是正常现象。


2.9 PixelMap 创建与复制

很多新人:

喜欢:

let newMap = oldMap

以为:

复制了一份。

其实:

只是:

引用。

真正复制:

需要:

重新创建。

例如:

原图 48MB

复制:

48MB + 48MB = 96MB

再复制:

144MB

再复制:

192MB

所以:

企业项目:

几乎不会:

无限复制:

PixelMap。

一般:

只有:

原图 ↓ 结果图

两份。


2.10 为什么图片编辑都围绕 PixelMap?

因为:

PixelMap:

拥有:

  • 原始 RGBA 数据
  • Alpha 通道
  • 宽高
  • 色彩空间
  • 可直接绘制
  • 可重新编码

所有图片编辑 API:

最终操作的都是:

PixelMap

例如:

旋转:

PixelMap ↓ Canvas.rotate() ↓ 新的 PixelMap

裁剪:

PixelMap ↓ Canvas.drawImageRect() ↓ 新的 PixelMap

水印:

PixelMap ↓ Canvas.drawText() ↓ 新的 PixelMap

压缩:

PixelMap ↓ ImagePacker ↓ JPEG

所以:

整个图片编辑流程实际上就是:

ImageSource ↓ PixelMap ↓ Canvas ↓ PixelMap ↓ ImagePacker ↓ JPEG
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/1 1:59:46

文件读写与with上下文

一、本次学习内容本次笔记内容主要是第8册中文件读写1、open要求:用完必须关闭,否则数据可能没写进磁盘先打开文件 f open()再写入文件 fwrite()最后关闭文件 fclose() #必须关闭open的几种模式r 只读模式w 写入模式,当文件不存在时创建…

作者头像 李华
网站建设 2026/8/1 1:54:55

大模型时空推理能力测试与优化方案

1. 项目概述:大模型时空推理能力基准测试2024年NIPS会议上这项关于大语言模型时空推理能力的基准测试研究,揭示了当前AI系统在理解和处理时空关系方面的真实水平。作为AI从业者,我们每天都在使用各类大模型,但很少有人系统性地测试…

作者头像 李华
网站建设 2026/8/1 1:44:00

数据血缘安全防护体系架构与实战解析

1. 数据血缘安全防护体系的核心价值在大数据生态中,数据血缘如同人体的血液循环系统——它记录了数据从产生到消费的全链路流转路径。我曾参与某金融机构数据中台项目时,发现当一份客户征信报告被异常调用时,传统审计手段需要人工追溯12个系统…

作者头像 李华
网站建设 2026/8/1 1:43:09

AICC智能体话术设计与架构实战解析

1. AICC智能体话术设计核心解析在客户服务与营销自动化领域,AICC(AI Contact Center)智能体正逐步改变传统交互模式。作为从业12年的智能对话系统架构师,我见证过从简单脚本机器人到具备上下文理解能力的智能体演进全过程。现代AI…

作者头像 李华
网站建设 2026/8/1 1:40:03

游戏剧情编辑器实战:从数据驱动到可视化分支管理

最近在开发一个龙族题材的RPG游戏时,遇到了剧情分支管理的难题。传统的if-else嵌套让代码越来越臃肿,直到尝试了剧情编辑器模式,才发现原来游戏剧情可以如此优雅地管理。本文将分享一套完整的剧情编辑器实战方案,从基础概念到项目…

作者头像 李华