c++magick++

Magick++ Image.GetPixels return nullptr after many succesful iterations


I'm trying to make steganography with C++ using Magick++. Here is my code for now

#include <iostream>
#include <fstream>
#include <string>
#include <Magick++.h>
#include <bitset>
#include <vector>
int main()
{
    using namespace Magick;
    using namespace std;
    int wd = 0, ht = 0;
    InitializeMagick(nullptr);
    ifstream f("FileToHide.exe", ios::binary);
    char tmp;
    string hiddenmsg;
    vector< bitset<8> > bits;
    copy(istream_iterator<char>(f),
        istream_iterator<char>(),
        back_inserter(bits));
    int posvect = 0;
    int posbits = 0;
    Image src("Shifr.jpg");
    src.modifyImage();

    
    for(size_t i = 1; i <= src.size().height(); i++)
    {
        for(size_t j = 1; j <= src.size().width(); j++)
        {
            auto pixel = src.getPixels(j, i, j, i);
            bitset<16> tmpbits(pixel[0].red);
            tmpbits[15] = bits[posvect][posbits];
            pixel[0].red = tmpbits.to_ulong();
            posbits++;
            if(posbits == 8)
            {
                posvect++;
                posbits = 0;
                if(posvect == bits.size())
                {
                    src.syncPixels();
                    src.write("Shifr2.jpg");
                    return 0;
                }
            }


        }
    }
    throw invalid_argument("File is too big");
}

I'm using picture with resolution 885x1080 and type .jpg. So when i=540 and j=443, src.getPixels(j, i, j, i) returns nullptr. I tried to skip it, but every next iteration returns nullptr too.


Solution

  • You're probably encountering undefined behaviour as you're not using getPixels correctly. Please see the documentation

    PixelPacket* getPixels ( const int x_, const int y_,
                             const unsigned int columns_,
                             const unsigned int rows_ )
    

    I.e. you want to use src.getPixels(j, i, 1, 1); for a single pixel