c++magick++

ImageMagick C++ Version 7 Modify Pixel Value in Blank Image


I have the following code that creates a blank black image and then attempts to write to that image by modifying each pixel to red.

Magick::Image image(Magick::Geometry(1024, 1024),
Magick::Color(std::uint8_t(0), std::uint8_t(0), std::uint8_t(0)));
assert(image.channels() == 3 && "Created wrong image format.");
image.type(Magick::TrueColorType);
image.fillColor("black");
std::size_t w = image.columns();
std::size_t h = image.rows();
assert(image.columns() == 1024 && image.rows() == 1024);
Magick::Quantum *mpixels = image.setPixels(0, 0, w, h);
for (int row = 0; row < h - 1; ++row) {
  for (int col = 0; col < w - 1; ++col) {
    std::size_t offset = (w * row + col);
    std::size_t moffset = image.channels() * offset;
    mpixels[moffset + 0] = 255;
    mpixels[moffset + 1] = 0;
    mpixels[moffset + 2] = 0;
  }
}
image.syncPixels();
image.write(out.c_str());

However, after inspecting the image it is still all black after changing the pixel values. What do I need to change to modify the pixel values?


Solution

  • I suspect that you are using the Q16 version of ImageMagick which means that each pixel channel value will be in the range 0-65535 and you are using 255 for the red channel which is really close to black. I think the following will fix your issue:

    mpixels[moffset + 0] = 65535;

    You could also decide to switch to the Q8 version of ImageMagick if channels in the range 0-255 would be sufficient for you.