2017-08-13 23 views
-1

Ich habe einen Puffer, der die Daten für ein RLE-komprimiertes 8-Bit-RGB-TGA-Bild enthält. Ich möchte diese in ein Magick ++ Bild laden, aber ich halteMagick ++ nicht geladen TGA-Blob

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

Hier bekommen ist mein Code

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

Wenn ich es erkenne ich bekommen

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

Ärgerlicher, wenn ich diese angeben info, dann klappt es gut. Ich kann es auch konvertieren:

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

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

Und in der Tat test.jpg und window_borders.tga identisch aussehen. Warum kann das Format nicht automatisch erkannt werden?

+0

Es fühlt sich schwer zu sagen, es sei denn, wir verfolgen den Code mit Debugger und sehen, warum das Bild 'data_blob' von falschem Format ist? – AlexanderVX

+0

Siehe meine obige Bearbeitung. Ich habe dreifach überprüft, dass ich die richtigen Daten in den Blobkonstruktor einspeise, irgendwie ändert sich die Gültigkeit des Blobs abhängig von einem anderen unbekannten Faktor. – Max

+0

Und jetzt 'Magick :: Image m_image();' fehlt 'data_blob' Parameter? – AlexanderVX

Antwort

2

Warum kann das Format nicht automatisch erkannt werden?

Das TGA-Format hatte nie wirklich eine einzigartige „Magick-Nummer“ Header oder eine andere schnell + zuverlässig zu identifizieren, wenn ein TGA in einem Klecks existieren.

Wenn ich mich richtig erinnere, führte später erweiterte Version von TGA die Zeichenfolge TRUEVISION-XFILE als Magick-Kennung, aber in der Fußzeile Tabelle.

Ich bin kein Experte, aber ich stelle mir vor, einige Software-Designer würden ihre Köpfe schütteln.

Nun sind Sie nicht nur verantwortlich das Dateiformat vor der Zeit (gegeben durch Dateinamen) für das Wissen, sondern müssen vollständig & den Bild-Header um zu bestimmen, richtig gelesen, wo die Bilddaten halten, und Der Bildfuß beginnt.

Ich würde vermuten, dass dies ein großer Faktor in sein würde, warum es keine IsTGA Methode, wie wir IsPNG haben, IsTIFF, und so weiter ...

Wie zuvor habe eine Lösung gefunden.

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

Sie können aber auch Folgendes tun.

Magick::image m_image; 
m_image.magick("TGA"); 
m_image.read(data_blob);