我已经问过这个问题,但那是关于FreeImage
. 现在我正在尝试用ImageMagick
(更正确地说,用Magick++
)做同样的事情。
我所需要的只是获取图像中像素的 RGB 值,并能够将其打印到屏幕上。我在ImageMagick
论坛里问过这个,但是好像没有人。:-( 有人可以帮忙吗?
我已经问过这个问题,但那是关于FreeImage
. 现在我正在尝试用ImageMagick
(更正确地说,用Magick++
)做同样的事情。
我所需要的只是获取图像中像素的 RGB 值,并能够将其打印到屏幕上。我在ImageMagick
论坛里问过这个,但是好像没有人。:-( 有人可以帮忙吗?
版本 6 API
给定一个“图像”对象,您必须请求一个“像素缓存”,然后使用它。文档在这里和这里:
// load an image
Magick::Image image("test.jpg");
int w = image.columns();
int h = image.rows();
// get a "pixel cache" for the entire image
Magick::PixelPacket *pixels = image.getPixels(0, 0, w, h);
// now you can access single pixels like a vector
int row = 0;
int column = 0;
Magick::Color color = pixels[w * row + column];
// if you make changes, don't forget to save them to the underlying image
pixels[0] = Magick::Color(255, 0, 0);
image.syncPixels();
// ...and maybe write the image to file.
image.write("test_modified.jpg");
版本 7 API
版本 7 中对像素的访问已更改(请参阅:移植),但仍然存在低级访问:
MagickCore::Quantum *pixels = image.getPixels(0, 0, w, h);
int row = 0;
int column = 0;
unsigned offset = image.channels() * (w * row + column);
pixels[offset + 0] = 255; // red
pixels[offset + 1] = 0; // green
pixels[offset + 2] = 0; // blue
@Sga 的答案对我不起作用,我正在使用ImageMagick-7.0.7-Q8
(8 位深度)库。
我是这样做的,逐像素扫描图像并输出每个图像的 RGB 值:
// "InitializeMagick" called beforehand!
void processImage()
{
std::ifstream fin;
std::stringstream fs;
fs << "/img.png";
std::cout << "Opening image \"" << fs.str() << "\".." << std::endl;
try
{
Image img;
img.read( fs.str() );
int imgWidth = img.columns();
int imgHeight = img.rows();
std::cout << "Image width: " << imgWidth << std::endl;
std::cout << "Image height: " << imgHeight << std::endl;
std::cout << "Image channels: " << img.channels() << std::endl;
img.modifyImage();
for ( int row = 0; row <= imgHeight; row++ )
{
for ( int column = 0; column <= imgWidth; column++ )
{
ColorRGB px = img.pixelColor( column, row );
std::cout << "Pixel " << column << "," << row << " R: " << px.red() << " G: " << px.green() <<
" B: " << px.blue() << std::endl;
}
}
}
catch ( Magick::Exception & error )
{
std::cerr << "Caught Magick++ exception: " << error.what() << std::endl;
}
fin.close(); // Close the file
}