多次成功迭代后的 Magick++ Image.GetPixels return nullptr

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

我正在尝试使用 Magick++ 通过 C++ 进行隐写术。这是我现在的代码

#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");
}

我使用的图片分辨率为 885x1080,类型为 .jpg。所以当 i=540 和 j=443 时,src.getPixels(j, i, j, i) returns nullptr。我试图跳过它,但每次下一次迭代也是 returns nullptr。

您可能遇到了未定义的行为,因为您没有正确使用 getPixels。请参阅 the documentation

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

即你想对单个像素使用 src.getPixels(j, i, 1, 1);