多次成功迭代后的 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);
我正在尝试使用 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);