Autor |
Beitrag |
Uli Schoch
      
Beiträge: 81
|
Verfasst: Sa 12.10.02 21:17
Hallo
Ich möchte die einzelnen Bildpunkte einer JPG-Datei bearbeiten, z.B. ein ganzes Bild heller machen. Dazu lade ich die Datei in ein TImage namens 'Image' mit Image.Picture.LoadFromFile(<Dateiname>). Wie kann ich auf jeden Bildpunkt zugreifen?
Bei BMP-Dateien geht das problemlos. (Ich verwende Delphi 3)
Besten Dank
Uli
|
|
JacFab
      
Beiträge: 111
|
Verfasst: Mo 14.10.02 16:57
Ich hab das so gemacht, dass ich meine jpeg datei erst mal in bmp umgewandelt habe!
Dann hab ich sie verändert und das ganz dann wieder mit jpeg codiert.
Das ist natürlich mit qualitätsverlust verbunden, aber anders wüste ichs nicht!
|
|
Uli Schoch 
      
Beiträge: 81
|
Verfasst: Mo 14.10.02 17:08
Hallo JacFab
Machst du die Umwandlung mit Delphi, wenn ja, wie? oder mit einem Photobearbeitungsprogramm?
Gruss
Uli
|
|
aogwaba
      
Beiträge: 109
|
Verfasst: Mo 14.10.02 17:28
Hi!
jpeg ist ein Datenträgertausch-format (Kompression).
Im RAM-Speicher liegen die Daten alle im gleichen Format.
Wenn du die jpeg-unit einbindest, kannst du die einfach einlesen.
cu
waba
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: Mo 14.10.02 17:40
Du mußt zuerst wissen was Jpeg ist. Es ist eine komprimierte Grafik. Nicht so wie GIF, die mit ZIP vergleichbar wäre. Hier wird alles nur kompakter abgespeichert ohne Verluste. JPEG ist wie MP3 und ist mit Verlusten verbunden. Was das Auge auf die Entfernung nicht sehen kann wird entfernt. Deshalb kann Jpegs eigentlich gar nicht bearbeiten, da es sich mehr um einen Algorithmus handelt als um ein Bild.
Benutze für die Umwandlung Assign. Erstelle eine TBitmap Variable und übergib der Bitmap deine Jpeg. Hab es selbst noch nicht ausprobiert, allergdings müßte es funktionieren. Nachts sind alle Kazen grau und alle Grafiken sind intern Bitmaps
Bmp.Assign(Jpeg)
|
|
Uli Schoch 
      
Beiträge: 81
|
Verfasst: Mo 14.10.02 20:59
Hallo Popov
Das mit dem Assign verstehe ich nicht.
So lese ich eine Bilddatei ein:
Quelltext 1: 2: 3:
| if OpenPD.Execute then begin { OpenPD ist ein TOpenPictureDialog } FormX.Image.Picture.LoadFromFile(OpenPD.Filename); end; |
Ist Filename irgendwas.bmp, so kann ich auf Image.Picture.Bitmap zugreifen. Ist Filename irgendwas.jpg, so ist nichts im Bitmap. Wo oder was muss ich Assignen?
Gruss
Uli
|
|
patmann2001
      
Beiträge: 201
Windows 7 Prof.
Delphi XE2
|
Verfasst: Mi 16.10.02 17:37
Hier
Mit diesem Code macht man aus einem JPEG ein BitMap
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure JPEGtoBMP(FileNameJPG,FileNameBMP : string); var jpeg : TJPEGImage; bmp : TBitmap; begin jpeg:= TJPEGImage.Create; try jpeg.LoadFromFile(FileNameJPG ); //jpeg.CompressionQuality := 100; {Normaler Wert, kann weggelassen werden} bmp:= TBitmap.Create; try bmp.Assign(jpeg); bmp.SaveTofile(FileNameBMP); finally bmp.free end; finally jpeg.free end; end; |
cu Patmann
|
|
Uli Schoch 
      
Beiträge: 81
|
Verfasst: Mi 16.10.02 20:38
Hallo Patmann
Das JPG-Bilder bearbeiten geht schon ganz gut. Ich muss aber beim Laden von JPG-Dateien
Quelltext 1:
| jpg.LoadFromFile(OpenPD.Filename); |
aufrufen, dann
Quelltext 1:
| Image.Picture.Bitmap.Assign(jpg); |
beim Laden von Bitmapdateien
Quelltext 1:
| Image.Picture.LoadFromFile(OpenPD.Filename); |
Muss ich denn aufgrund der Dateierweiterung .JPG oder .BMP entscheiden, welchen LoadFromFile ich benützen muss. Der Image.Picture.LoadFromFile(OpenPD.Filename); geht nämlich auch bei .JPG-Dateien, nur ist dann die Bitmap leer.
Gibt’s einen Trick??
Gruss
Uli
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: Mi 16.10.02 21:44
Das System entscheidet eigentlich automatisch anhand der Endung um was für einen Dateityp es sich handelt. In der OnlineHilfe steht irgendwo, daß das zumindest so bei Bmp, Wmf und Ico ist. Weiss aber nicht mehr wo das steht. Müßte also auch so bei Bmp und Jpg sein.
Wenn du da also Probleme bei
Quelltext 1:
| Image.Picture.LoadFromFile(OpenPD.Filename); |
hast, dann solltest du vorher prüfen und das beeinflussen. Vielleicht solltest du nicht OpenPD.Filename direkt nehmen.
|
|
patmann2001
      
Beiträge: 201
Windows 7 Prof.
Delphi XE2
|
Verfasst: Do 17.10.02 09:21
Hallo Uli Schoch
Nach mehren anläufen verstehe ich jetzt endlich das Problem.
Zitat: | Quelltext 1:
| Image.Picture.LoadFromFile(OpenPD.Filename); | |
Diese Anweisung kann nur die von Image unterstützen Bildformat laden, also KEINE JPG. Um ein JPG in einem Image darstellen zu können, muss Du es erst in ein BMP konvertieren. Deshalb bleibt das Image leer.
@ Popov
OpenPD.Filename ist nur ein String. Es ist Image.Picture.LoadFromFile(OpenPD.Filename); egal woher der kommt. Das beeinflusst nicht das Laden.
cu Patmann
|
|
Uli Schoch 
      
Beiträge: 81
|
Verfasst: Do 17.10.02 17:06
Hallo Patmann
Die Anweisung:
Quelltext 1:
| Image.Picture.LoadFromFile(OpenPD.Filename); |
geht eben doch auch für JPG-Dateien, also wenn OpenPD.Filename xxx.jpg ist. Das ist eigentlich schön. Nur kann ich dann nicht auf die Bitmap zugreifen. Gibt es irgendwo eine Dok, in der die ganze Geschichte mit Bitmaps, Images IPEGImages etc beschrieben ist, die Delphihilfe ist leider unbrauchbar.
Gruss
Uli
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: Do 17.10.02 17:26
Delphi arbeitet viel mit den Systemroutinen von Windows. Somit wird nicht jedes mal das Rad neu erfunden. Darunter fallen auch die Windows Bildformate Bitmap, Metafile und Symbole. Delphi greift hier also auf die Windows Standardformate zurück. Delphi bearbeitet diese Formate nicht selbst. Einen LineTo Befehl gibt es auch in Delphi, es ist aber eine Kapselung der API Funktion LineTo. Delphi macht das ganze nur etwas leichter. Delphi macht kaum etwas neu. Und dann kamm JPEG. Es ist im grundegenommen eine Unit die Jpeg läd, sie dann in Bitmap umwandelt und sie, wenn Änderungen durchgeführt wurden, wider als Jpeg speichert. Jpeg ist nur eine Erweiterung.
Warum machst du dir also immer noch die ganze Zeit den Stress und willst mit Jpeg arbeiten. Lade Jpeg, wandele es in Bitmap um, arbeite mit Bitmap weiter, wandle es wieder in Jpeg um und speichere es dann wieder.
Und las die Sache mit dem Image. Image ist nur zum anzeigen der Bilder gedacht. Intern kannst du wunderbar mit TBitmap arbeiten und nur als letzte Aktion an Image kopieren.
|
|
Uli Schoch 
      
Beiträge: 81
|
Verfasst: Do 17.10.02 19:20
Salü Popov
Ich will eben BMP- und JPG-Dateien in mein Bildbearbeitungs-Programm laden können. Das Image brauche ich dann nur zum Anzeigen der Bilder, die Bitmap zum Verändern des Bildes (heller, dunkler und so)
Gruss
Uli
|
|