2017-08-13 3 views
-1

RLE圧縮8ビットRGB TGA画像のデータを含むバッファがあります。私は魔術++画像にこれをロードしたいが、私はここでMagick ++はTGAブロブを読み込んでいません

Magick: no decode delegate for this image format `' @ error/blob.c/BlobToImage/353 

を得続けることは私のコードは、私はそれを識別した場合、私はこれを指定した場合、私は、うるさく

window_borders.tga TGA 330x390 330x390+0+0 8-bit sRGB 33106B 0.000u 0:00.000 

を取得

#include <Magick++.h> 
#include <fstream> 

int main(int argc, char** argv) 
{ 
    std::ifstream file("window_borders.tga", std::ios::binary | std::ios::ate); 
    std::streamsize size = file.tellg(); 
    file.seekg(0, std::ios::beg); 

    char* buffer = new char[size]; 
    if (!file.read(buffer, size)) return 1; 

    Magick::Blob data_blob(buffer, size); 
    Magick::Image m_image(data_blob); 

    return 0; 
} 

です情報、それはうまく動作します。私もそれを変換することができます

Magick::Image m_image(data_blob, Magick::Geometry("330x390"), "TGA"); 

m_image.magick("JPEG"); 
m_image.write("test.jpg"); 

そして実際test.jpgwindow_borders.tgaが同じに見えます。なぜ自動的にフォーマットを検出できないのですか?

+0

デバッガでコードをトレースして、イメージ 'data_blob'の形式が間違っているのを確認しないと、気になりません。 – AlexanderVX

+0

上記の私の編集を参照してください。私はトリプルを確認して、ブロブコンストラクタに正しいデータを入力していることを確認しました。ブロブの有効性は、他の未知の要素によって変化します。 – Max

+0

そして、 'Magick :: Image m_image();'に 'data_blob'パラメータがありませんか? – AlexanderVX

答えて

2

なぜ自動的にフォーマットを検出できないのですか?

TGA形式は、本当にユニークな「魔術番号」ヘッダ、またはいくつかの他の 迅速+ TGAはブロブ内に存在するかどうかを確認するために信頼性の高い方法がなかったです。

私が正しく覚えていれば、TGAの後の拡張バージョンは、文字列 TRUEVISION-XFILEをmagick識別子として導入しましたが、ファイルのフッターテーブルにあります。

私は専門家ではありませんが、一部のソフトウェア設計者が の頭を振っていると思います。

は今、あなたは(指定したファイル名で)前もって のファイル形式を知るために責任があるが、完全に&正しく画像データが停止した場所を決定するために画像ヘッダ を読み、する必要がないだけイメージフッタが起動します。

私は、これはあなたが以前に一つの解決策を発見してきたように、我々はIsPNGIsTIFFを持っている、というように...

のように何の IsTGA方法はありません、なぜに大きな要因であろうと推測します。

Magick::Image m_image(data_blob, Magick::Geometry("330x390"), "TGA"); 
// This should work too. 
Magick::Image m_image(data_blob, Magick::Geometry("0x0"), "TGA"); 

しかし、あなたはまた、次のことを行うことができます。

Magick::image m_image; 
m_image.magick("TGA"); 
m_image.read(data_blob); 
関連する問題