TImage anpassen
-
Danke für den Tipp, funktioniert aber leider nicht. Wenn ich die Zeile ausblende bekomme ich folgenden Fehler:...im Projekt ist folgende Exception der Klasse EInvalidOperation aufgetreten. "Ein Bild kann nur geändert werden, wenn es ein Bitmap enthält!"...
Heißt das etwa, dass dieser Code nur für *.bmp funktioniert?
-
Nein nicht unbedingt.
Kannst auch JPEGs oder GIFs nehmen, allerdings habe ich es bei mir so gelöst, dass die Bilder, nach dem Einlesen einem TBitmap zugewiesen werden. Sprich das Bild in ein TJPEGImage einlesen, dieses dann einem TBitmap 'assignen'.
-
Aha, ich glaube fast, dass das für mich noch zu hoch ist. Werde mich gleich mal schlau machen, wie ich das machen kann.
Kannst mir vielleicht auch ein Code-Bsp geben.
THX
EDIT:
Geht das ungefähr so: (hab ich in der BSB Hilfe gefunden)TJPEGImage *jp=new TJPEGImage();
try
{
jp->Assign(Image->Picture->Bitmap);
}
__finally
{
delete jp;
}
-
Das hängt mehr davon ab, in welchem Format die Bilder auf der Festplatte gespeichert sind. Für diese Formate gibt es Importfilter (eben zum Beispiel TJPEGImage). Damit liest man die Datei ein. Zur Verarbeitung verwendet man Bitmaps, weil dies das native Fornmat unter Windows ist.
In welchem Format liegen die Bilder bei Dir vor?
-
Sind in der Regel *.jpg bzw. *.jpeg
Edit:
Mein Code sieht jetzt so aus. Scheint auch zu funktionieren, tut es aber leider nicht 100%ig. Ich habe ein Bild mit Paint erstellt und als *.jpg gespeichert. In diesem Bild habe ich auch Text eingefügt. Wenn ich dieses Bild lade, gibt es einige Fehler. Die Schrift ist glaub ein bissle verzert und nicht vollständig. Wenn ich das Bild lade die größe manuell (habe im Explorer die Größe und Breite nachgeschaut und im Image->Widht bzw. ->Height manuell eingegeben)anpasse, dann wird das Bild richtig angezeigt.void TMainProg::Bild_laden(AnsiString bild) { Image->Picture->LoadFromFile(bild); StatusBar->Panels->Items[0]->Text="Aktuell angezeigtes Bild: " + bild.SubString(bild.LastDelimiter("\\")+1,bild.Length()); Graphics::TBitmap *bmp = new Graphics::TBitmap(); try { bmp->Assign(Image->Picture->Graphic); } catch(...) { } //Bild anpassen TRect ar; double factor_x; double factor_y; double factor; factor_x = (double) bmp->Width / (double) ScrollBox1->ClientWidth; factor_y = (double) bmp->Height / (double) ScrollBox1->ClientHeight; factor = factor_x > factor_y ? factor_x : factor_y; ar.top = 0; ar.left = 0; ar.right = bmp->Width / factor; ar.bottom = bmp->Height / factor; // Darstellung des Bitmaps Image->Picture->Assign(NULL); Image->Top = 0; Image->Left = 0; Image->Width = ar.right; Image->Height = ar.bottom; Image->Canvas->StretchDraw(ar, bmp); if (Image->Height < ScrollBox1->ClientHeight) // vertikal zentrieren? Image->Top = (ScrollBox1->ClientHeight - Image->Height) / 2; else Image->Top = 0; if (Image->Width < ScrollBox1->ClientWidth) // hozizontal zentrieren? Image->Left = (ScrollBox1->ClientWidth - Image->Width) / 2; else Image->Left = 0; delete bmp; }Edit2:
Es handelt sich echt nur um minimale Fehler in der Darstellung des Textes.
Kann dieser Fehler eventuell durch dich Division kommen. Hierbei entsteht ja eine Kommzahl. Und am Ende wird ja aus der Kommazahl (z.B. 736,6) wieder ein Integer erstehlt. Ich hab jetzt grad überlegt, ob eventuell bei Image->Width aufgerundet und bei Image->Heigth abgerundet wird, und dass dieser eine Pixel dann das Bild so leicht verzerrt, dass es auffällt.
Was haltet ihr davon??? Holzweg
oder gute Idee
??