TJPEGImage mit unterschiedlichen Qualitätsstufen anzeigen?



  • Moin moin!

    Wie bekomme ich es hin, zur Laufzeit ein Foto in vier verschiedenen Qualitätsstufen anzuzeigen? Bis jetzt habe ich es folgendermaßen versucht, erkenne allerdings keinen Unterschied zwischen den einzelnen Bildern:

    TJPEGImage *foto[3];
    for(int i = 0; i < 3; ++i)
    {
         foto[i] = new TJPEGImage();
         foto[i]->LoadFromFile(Fileabsolut);
    
    }
    foto[0]->CompressionQuality=60;
    foto[1]->CompressionQuality=40;
    foto[2]->CompressionQuality=1;
    //Orginal
    Image1->Picture->LoadFromFile(Fileabsolut);
    //60%
    Image2->Picture->Assign(foto[0]);
    //40%
    Image3->Picture->Assign(foto[1]);
    //1%
    Image4->Picture->Assign(foto[2]);
    

    Was mache ich falsch?

    Danke im Vorraus!

    MfG

    Hupe

    [ Dieser Beitrag wurde am 07.02.2003 um 23:04 Uhr von hupe editiert. ]



  • Die Kompressionsrate wird sich wohl (wenn überhaupt) nur beim Speichern auswirken.



  • Ja aber wenn ich dann ...

    foto[0]->SaveToFile("test1.jpg");
    foto[1]->SaveToFile("test2.jpg");
    foto[2]->SaveToFile("test3.jpg");
    

    ...schreibe, erstellt er mir 3 jpg´s mit gleicher Größe. Gibt es auch ne Möglichkeit die Bilder darzustellen , ohne sie vorher auf Platte zu speichern.

    MfG

    Hupe

    [ Dieser Beitrag wurde am 07.02.2003 um 23:30 Uhr von hupe editiert. ]



  • Du kannst sie in nen stream speichern und wieder auslesen. Vor dem speichern die Qualität setzen und ->Compress() anwenden. Dann wieder laden und du siehst wie die Komprimiert aussehen.



  • So ich habe jetzt ...

    foto[0]->Compress();
    foto[0]->SaveToStream(stream);
    foto[0]->LoadFromStream(stream);
    Image2->Picture->Assign(foto[0]);
    

    ... eingebaut. Jetzt bekomme ich zur Laufzeit immer die Fehlermeldung :
    JPG-Fehler #41.



  • vor dem loadfromstream muss ein "stream->Position = 0" stehen



  • Schonmal vielen Dank! Das mit dem SaveToStream() und LoadFromStream() funktioniert jetzt. Nur wenn ich die Methode foto[0]->Compress() ausführe, kommt trotzdem der gleiche Fehler. Deshalb habe ich foto[0] danach mal als Datei gespeichert und es wurde eine leere Datei abgespeichert. Was ist jetzt noch falsch? Ohne Compress() wird die Datei genauso wie Orginaldatei dargestellt.

    foto[0]->CompressionQuality=50;
    foto[0]->Compress();
    foto[0]->SaveToStream(stream);
    stream->Position=0;
    foto[0]->LoadFromStream(stream);
    Image1->Picture->Assign(foto[0]);
    


  • Wenn stream richtig initialisiert ist (new) sollte das..., nein vielmehr muss das so gehen...



  • Hier nochmal der ganze Code:

    AnsiString Fileabsolut = Dir+"\\"+ListBox1->Items->Strings[nummer];
            Image4->Picture->LoadFromFile(Fileabsolut);
            TJPEGImage *foto[3];
            TMemoryStream *stream = new TMemoryStream();
            for(int i = 0; i < 3; ++i)
            {
                    foto[i] = new TJPEGImage();
                    foto[i]->LoadFromFile(Fileabsolut);
    
            }
            foto[0]->CompressionQuality=10;
            foto[1]->CompressionQuality=40;
            foto[2]->CompressionQuality=60;
            foto[0]->Compress();
            foto[0]->SaveToStream(stream);
            stream->Position=0;
            foto[0]->LoadFromStream(stream);
            Image5->Picture->Assign(foto[0]);
    

    Fehler: JPG-Fehler #41!!!!



  • So habe es hinbekommen!
    Lösung: JPG in BMP dann wieder BMP in JPG und schon kann man die CompressionQuality bestimmen.

    MfG

    Hupe


Anmelden zum Antworten