現在 Qt でプログラミングを行っていますが、理解できない問題があります。これがQtが原因かどうかはわかりません。
私はこのコードを持っています:
cimg_library::CImg<float> img = model->convert("photo.jpg", 15);
model->save(img, "resIhm.jpg");
これは問題なく動作しますが、いくつかの QT コード (ここでは QApplication オブジェクトの宣言) を導入すると、メソッド「convert」の結果が異なります..
QApplication *app = new QApplication(argc,argv);
cimg_library::CImg<float> img = model->convert("photo.jpg", 15);
model->save(img, "resIhm.jpg");
しかし、私がこれを行うと:
cimg_library::CImg<float> img = model->convert("photo.jpg", 15);
model->save(img, "resIhm.jpg");
QApplication *app = new QApplication(argc,argv);
それは再び動作します。実際、これらの 2 行のコードは通常 Qt SLOT で実行されるため、事前に QApplication オブジェクトを宣言する必要があります。
QApplication 宣言がなくても機能すると確信しています。このコードは、デバッグ目的でメイン関数にあります。
さらに、QCoreApplication を使用すると、それも機能します。Qt は C++ ストリームを変更しますか?
ご協力いただきありがとうございます :)
ps: Model クラスで Qt を使用していません。
編集: 使用されるモデル関数 (目的は、画像を ASCII アートに変換することです):
CImg<float> Model::convert(const char* source, int tailleCaracteres) const throw (ConversionException) {
try {
CImg<float> image(source);
image.normalize(0,50);
int nbRef = 95;
CImgList<float> refCode(nbRef, tailleCaracteres, tailleCaracteres, 1, 3);
float white[3] = {255,255,255};
float black[3] = {0,0,0};
int i = 0;
for (char l=' '; l<='~'; l++) {
if(l == '%') {
char ch[3] = "";
ch[0] = '%';
ch[1] = l;
ch[2] = '\0';
refCode(i).draw_text(0, 0, ch, white, black, 1, tailleCaracteres);
} else {
char ch[2] = "";
ch[0] = l;
ch[1] = '\0';
refCode(i).draw_text(0, 0, ch, white, black, 1, tailleCaracteres);
}
i++;
}
CImg<float> imgDest;
CImgList<float> cols = image.get_split('y', -tailleCaracteres);
for(unsigned int i=0; i<cols.size(); i++) {
CImgList<float> rows = cols(i).get_split('x', -tailleCaracteres);
CImg<float> destRows;
for(unsigned int j=0; j<rows.size(); j++) {
int indice = recupImgProcheErreur(rows(j), refCode);
destRows.append(refCode(indice), 'x');
}
imgDest.append(destRows, 'y');
}
return imgDest;
}
catch (CImgIOException exp) {
throw ConversionException(std::string(exp.what()));
}
}
int Modele::calculErreur(CImg<float> img, CImg<float> car) const {
int erreur = 0;
cimg_forX(img, i) {
cimg_forY(img, j) {
erreur += img(i,j,0,0) - car.atXY(i,j);
}
}
return erreur;
}
void Modele::save(CImg<float> img, const char* pathDestination) const {
img.save(pathDestination);
}
Valgrind は、この行に問題があることを教えてくれました (条件付きのジャンプまたは移動は、初期化されていない値に依存します): erreur += img(i,j,0,0) - car.atXY(i,j);
私は今日の午後それを修正しようとしましたが、失敗しました.. car.atXY(i,j) が付属していることを知っています (これは car(i,j,0,0) と同じだと思います)。
変数名がわからない場合は申し訳ありませんが、フランス語ですが、お気軽にお問い合わせください :)