Magick::Pixels

Pixels 类提供了对原始图像像素的高效访问。图像像素(类型为Quantum)可以通过Image Pixel Cache(图像像素缓存)直接访问。图像像素缓存是实际图像像素的一个矩形窗口(视图),这些像素可能存储在内存中、从磁盘文件内存映射或完全位于磁盘上。通过get()获取现有的图像像素。使用set()创建新的像素区域。

根据操作系统的功能以及窗口与图像的关系,像素缓存可能是所选窗口中像素的副本,也可能是实际的图像像素。无论哪种情况,调用sync()都能确保基础图像使用修改后的像素缓存内容进行更新。decode()方法支持根据QuantumTypes将外部像素数据格式复制到像素缓存中。encode()方法支持根据QuantumTypes指定的格式将缓存中的像素复制到外部像素表示形式中。

使用 Pixels 类设置视图不会导致对基础图像的引用数减少到 1。因此,为了确保仅修改图像的当前版本,应调用 Image 的modifyImage()方法,将基础图像的引用计数减少到 1。如果不这样做,则由于在复制或构造 Image 时使用引用计数,可能会修改图像的先前版本。

setget 方法返回的Quantum* 以及indexes 方法返回的void* 指向由Pixels 类管理的像素数据。Pixels 类负责释放与像素视图关联的资源。这意味着永远不应该将该指针传递给 delete() 或 free()。

像素视图是一个小的图像,其中可以访问、寻址和更新像素,如下例所示,该例生成的图像类似于右侧的图像(减去线条和文本)

#include <Magick++.h> #include <iostream> using namespace std; using namespace Magick; int main(int argc,char **argv) { InitializeMagick(*argv); // 创建基础图像 Image image(Geometry(254,218), "white"); // 将图像类型设置为 TrueColor DirectClass 表示。 image.type(TrueColorType); // 确保仅有一个对基础图像的引用 // 如果不这样做,则不会修改图像像素。 image.modifyImage(); // 分配像素视图 Pixels view(image); // 将锚定在 38x36 处、大小为 160x230 的区域中的所有像素设置为绿色。 size_t columns = 196; size_t rows = 162; Color green("green"); Quantum *pixels = view.get(38,36,columns,rows); for ( ssize_t row = 0; row < rows ; ++row ) for ( ssize_t column = 0; column < columns ; ++column ) { *pixels++=QuantumRange*green.quantumRed(); *pixels++=QuantumRange*green.quantumGreen(); *pixels++=QuantumRange*green.quantumBlue(); } // 将更改保存到图像。 view.sync(); // 将锚定在 86x72 处、大小为 108x67 的区域中的所有像素设置为黄色。 columns = 108; rows = 67; Color yellow("yellow"); pixels = view.get(86,72,columns,rows); for ( ssize_t row = 0; row < rows ; ++row ) for ( ssize_t column = 0; column < columns ; ++column ) { *pixels++=QuantumRange*yellow.quantumRed(); *pixels++=QuantumRange*yellow.quantumGreen(); *pixels++=QuantumRange*yellow.quantumBlue(); } view.sync(); // 将 108,94 位置的像素设置为红色 Color red("red"); pixels = view.get(108,94,1,1); *pixels++=QuantumRange*red.quantumRed(); *pixels++=QuantumRange*red.quantumGreen(); *pixels++=QuantumRange*red.quantumBlue(); // 将更改保存到图像。 view.sync(); image.write( "logo.png" ); }

Pixels 支持以下方法

像素缓存方法

方法

返回值

签名

描述

get

Quantum*

const ssize_t x_, const ssize_t y_, const size_t columns_, const size_t rows_

将图像中的读写像素传输到由指定矩形区域定义的像素缓存中。修改后的像素随后可以通过sync传输回图像。返回值仅用于像素访问。永远不应该释放它。

getConst

const Quantum*

const ssize_t x_, const ssize_t y_, const size_t columns_, const size_t rows_

将图像中的只读像素传输到由指定矩形区域定义的像素缓存中。

set

Quantum*

const ssize_t x_, const ssize_t y_, const size_t columns_, const size_t rows_

分配一个像素缓存区域,以存储由区域矩形定义的图像像素。此区域随后通过sync从像素缓存传输到图像。返回值仅用于像素访问。永远不应该释放它。

sync

void

void

将图像缓存像素传输到图像。

indexes

void*

void

返回与上次getgetConstset 调用定义的像素区域相对应的伪彩色像素索引。仅对 PseudoColor 和 CMYKA 图像有效。像素索引(类型为void的数组,它是Quantum的 typedef,Quantum 本身又是unsigned charunsigned short的 typedef,具体取决于QuantumDepth定义的值)为图像中每个像素提供colormap索引(参见colorMap)。对于 CMYKA 图像,索引表示黑色通道。返回值仅用于像素访问。永远不应该释放它。

x

int

void

视图的左坐标

y

int

void

视图的顶部坐标

columns

size_t

void

视图的宽度

rows

size_t

void

视图的高度