直接回答
制作输入前先确认模型/API 契约和解码后的 Bitmap 表示。PNG 将未关联颜色与 alpha 分开存储;Android Bitmap 为绘制可将 RGB 预乘 alpha。getPixel/getPixels 返回 sRGB 中的非预乘 ARGB 视图,不是广色域原始像素证据。copyPixelsToBuffer 按 Bitmap.Config 打包并复制已存字节,但缓冲区本身不携带 ColorSpace 等元数据。应把 Config、宽高、rowBytes、getColorSpace 和 isPremultiplied 与字节一并记录。Config.HARDWARE 不支持 getPixel、getPixels 和 copyPixelsToBuffer;先检测,只有受控软件副本可用且被记录时才读取,否则标为不可读取。 如果已记录的推理输入允许 alpha,就保留该通道并核对实际传入边界,不要无故展平。如果使用方要求不透明输入,应先选定背景和目标颜色空间,再确定合成顺序。不要假设透明像素自动变为黑色或白色:完全透明的 PNG 像素仍可能含有不可见 RGB,丢弃 alpha 后这些颜色会露出来。夹具应包含透明度为零但隐藏 RGB 亮眼的像素,以检测错误丢弃。 颜色空间元数据是另一份契约。Android Bitmap.setColorSpace 会改变框架解释已有像素值的方式,但不会改写底层像素分配;它不是颜色值转换。如果确实需要在已知颜色空间之间转换,应使用有文档的像素转换,例如 ColorSpace.Connector,或经验证的绘制流程,把像素写到指定目标颜色空间的 Bitmap 中。记录源颜色空间、目标颜色空间和转换实现。不要假设所有输入都是 sRGB,也不要在没有推理运行时证据时声称支持广色域或 HDR。 合成还必须声明 transfer function 和实现。PNG 规范给出前景/背景公式,并要求使用强度样本而不是伽马编码样本。若目标是色度学意义上的线性光合成,应先转到线性工作空间,合成后再编码到目标空间。若使用平台绘制路径,应验证其在本格式上的真实行为;不要假设所有 Canvas 合成都是线性光。 JPEG 表示不透明像素,不能保留 alpha。若必须使用 JPEG,应在声明的目标空间与明确背景合成后再编码,并按预定的有损容差解码比较。把 alpha、颜色变换和压缩分开测试,使模型输入变化可追踪。本页是像素准备方法,不是模型准确率结果或 Cove 缺陷结论。
透明示意图导出后出现深色边缘
Android 工程师收到一张带透明背景和半透明标签的 PNG,并将其送入视觉流程。预览看起来正常,但 JPEG 副本出现深色边缘,下游结果也发生变化。目标模型契约以及 Android Bitmap 的准确表示还未记录。
决策
追踪解码后的 alpha 和颜色空间状态,确认使用方是否接受 alpha;只有确需不透明输入时才生成明确目标图。将背景合成、颜色值转换和有损编码作为不同变换测试。
预期结果
团队能复现实际送入推理边界的像素,并说明执行了哪些转换。结论仅适用于该夹具、Android 路径、编码器和已记录的输入契约。
需要收集的证据
只有将以下证据与同一模型文件和测试运行关联起来,结论才可复核:
- COVE-OCR-01:当前事实仅记录 Cove Photo 的结构化可见文本输出,不证明其输入 alpha 或颜色空间转换方式。
- MEMORY-01:图像输入张量、颜色转换副本和运行时缓冲会影响内存;不能从源文件大小推算峰值。
- ANDROID-IMAGE-ALPHA-COLOR-2026-10:Android Bitmap 与 PNG 对 alpha、像素值和颜色空间有不同表示边界;JPEG 不保留 alpha。
任务质量需要有版本记录的语料和验收规则;流畅的单条样例不等于准确度结果。
实施流程
- 固定输入和使用方契约. 记录源格式、尺寸、PNG 颜色与 alpha 元数据、Android 版本、解码路径、Bitmap.Config、getColorSpace、hasAlpha、isPremultiplied,以及已记录的模型输入格式。不要从文件后缀或预览效果推断使用方契约。
- 比较解码像素和访问结果. 准备不透明、透明、半透明及隐藏 RGB 小夹具。getPixel/getPixels 返回非预乘 sRGB;copyPixelsToBuffer 返回按 Config 打包的存储字节,不附颜色空间元数据。分别记录 Config、rowBytes、尺寸、ColorSpace 和预乘状态;先检测 HARDWARE,只从受控软件副本读取。
- 决定保留 alpha 还是合成. 若已记录的输入契约接受 alpha,就保留并测试该路径。若使用方要求不透明,先确定具名背景、目标颜色空间与合成 transfer function。不要让编码器或默认背景暗中决定像素。
- 在目标空间转换并合成. 记录源/目标 ColorSpace 和 transfer function。需要色度学线性光合成时,先转换到线性工作空间,合成后再编码到目标;其他策略也须命名并验证。Bitmap.setColorSpace 只改解释标签,不改像素值。
- 校验编码及解码结果. 如果必须输出 JPEG,先在选定背景上展平 alpha,再编码并解码,与编码前目标图比较。为有损回环预先定义通道或感知容差,不把字节完全相等设为 JPEG 验收条件。
- 保留针对变换的回归夹具. 测试透明边缘、隐藏 RGB、半透明像素、饱和颜色、源与目标色域及 JPEG 回环。按顺序记录每个变换并保留原始夹具;没有对应的输入证据,就不要把推理结果变化归因于 alpha 或颜色转换。
让每个阶段的状态都可观察。失败信息应指出阶段、模型、运行时和恢复动作,同时避免记录用户私密内容。
验收标准
- 记录源/目标 ColorSpace、transfer function、alpha/预乘状态、Config/rowBytes、像素访问路径、硬件或软件读取方式及使用方输入契约。
- 不透明路径记录合成域与背景,按需转换像素,并在丢弃 alpha 或编码 JPEG 前完成合成;支持的 alpha 保留路径另测。
- 不把 setColorSpace 当作数值转换,不把 getPixel/getPixels 当成原始广色域值,也不把 raw buffer 当自描述数据;访问 HARDWARE 前要先检查。
- JPEG 回环使用预先规定的有损容差,各变换分开测试,且不据此宣称推理准确率或 Cove 存在输入缺陷。
决策对照表
| 维度 | 选择或证据 | 解读方式 |
|---|---|---|
| 保留 alpha | 仅当已记录的使用方支持时,传递含 alpha 的表示 | 可避免展平,但不能证明所有模型或运行时接受 alpha 输入。 |
| 合成为不透明图 | 声明 transfer function 与实现,在目标域与固定背景合成,然后编码 | 得到确定的不透明像素;背景和合成域都会影响结果。 |
| 重贴颜色空间标签 | 仅当像素值本来就属于目标空间时修改 Bitmap 元数据 | Bitmap.setColorSpace 改变解释方式,不会自动转换底层通道值。 |
| 转换后编码 JPEG | 转换像素、合成 alpha、编码、解码并比较 | JPEG 不保存 alpha 且有损;验收前要确定目标格式和容差。 |
需要避免的失败模式
- 把 PNG 的非预乘 alpha 当成 Android Bitmap 中始终相同的原始通道值。
- 用 setColorSpace 重新贴标签来替代实际的像素颜色转换。
- 丢弃 alpha 或直接导出 JPEG,却没有明确不透明背景及有损比较容差。
还要避免静默回退、版本未固定、缺少取消处理,以及把不同配置的结果混在一起下结论。失败运行也应与成功记录一并保存。
最小复现记录
| 层级 | 记录内容 |
|---|---|
| 设备 | 厂商、型号、芯片、内存档位、操作系统版本 |
| 软件 | 应用版本和 Git 提交号 |
| 模型 | 系列、变体、版本、格式、文件长度、摘要、量化方式 |
| 运行时 | 名称、版本、请求后端及实际后端证据 |
| 工作负载 | 样例版本、输入摘要、提示词摘要、输出策略 |
| 结果 | 完成、失败、取消、回退及保护隐私的诊断信息 |
发布检查表
- ☐ 主要搜索问题已回答,且没有未经支持的数字。
- ☐ 所有模型文件和运行时版本均已固定。
- ☐ 代表性任务和失败处理策略均有说明。
- ☐ 生命周期、取消、清理和回退均已测试。
- ☐ 用户内容与网络边界均有说明。
- ☐ 结论只适用于被记录的配置。
- ☐ 新增测试结果时链接到原始方法或证据。
来源与相关证据
- Android Bitmap API:alpha、像素访问、色彩空间元数据和 JPEG 编码
- Android ColorSpace API:颜色空间连接器与像素变换
- Android Canvas API:Bitmap 绘制与合成操作
- W3C PNG 规范:alpha 通道表示
中文部署与排错专题见。奇连 AI 端侧专题。
常见问题
原始 Bitmap 像素缓冲包含颜色空间信息吗?
不包含。copyPixelsToBuffer 按 Bitmap.Config 复制实际存储字节;另行记录 Config、rowBytes、宽高、ColorSpace 和预乘状态。getPixel/getPixels 则返回非预乘 sRGB ARGB 视图。
Bitmap.setColorSpace 会转换像素值吗?
不会。Android 文档说明它会改变框架如何解释已有像素,但不更改底层分配。若输入契约要求转换,应使用真实颜色值变换,并核对结果像素。
JPEG 能保留透明背景吗?
不能。Android 文档说明 JPEG 只支持不透明像素。编码前选择背景并完成合成,再解码检查,因为 JPEG 有损。
alpha 应直接在编码后的 sRGB 值里混合吗?
若目标是色度学线性光合成,则不应如此。PNG 规范要求用强度样本而非伽马编码样本合成。记录传递函数和实现,用微型夹具验证;不能假设任意 Canvas 路径都会线性合成。
Config.HARDWARE 的 Bitmap 能直接读取像素吗?
Android 文档说明 getPixel、getPixels 和 copyPixelsToBuffer 对硬件 Bitmap 会抛出异常。先检查配置;只有在受支持且记录的受控软件副本可用时才读取,否则应标为不可读取。
这能证明 Cove 支持广色域或 alpha 输入吗?
不能。本文只是输入准备与验证方法。应核对准确模型或 API 契约和应用实际转换路径;PNG 解码器或 Bitmap 能力不等于推理支持。