Autor Beitrag
Uli Schoch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 111



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81



BeitragVerfasst: Mo 14.10.02 17:08 
Hallo JacFab
Machst du die Umwandlung mit Delphi, wenn ja, wie? oder mit einem Photobearbeitungsprogramm?

Gruss
Uli
aogwaba
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109



BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81



BeitragVerfasst: Mo 14.10.02 20:59 
Hallo Popov
Das mit dem Assign verstehe ich nicht.

So lese ich eine Bilddatei ein:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 201

Windows 7 Prof.
Delphi XE2
BeitragVerfasst: Mi 16.10.02 17:37 
Hier
Mit diesem Code macht man aus einem JPEG ein BitMap
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81



BeitragVerfasst: Mi 16.10.02 20:38 
Hallo Patmann

Das JPG-Bilder bearbeiten geht schon ganz gut. Ich muss aber beim Laden von JPG-Dateien
ausblenden Quelltext
1:
jpg.LoadFromFile(OpenPD.Filename);					

aufrufen, dann
ausblenden Quelltext
1:
Image.Picture.Bitmap.Assign(jpg);					

beim Laden von Bitmapdateien
ausblenden 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



BeitragVerfasst: 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 201

Windows 7 Prof.
Delphi XE2
BeitragVerfasst: Do 17.10.02 09:21 
Hallo Uli Schoch
Nach mehren anläufen verstehe ich jetzt endlich das Problem.
Zitat:
ausblenden 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. :wave:
cu Patmann
Uli Schoch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81



BeitragVerfasst: Do 17.10.02 17:06 
Hallo Patmann
Die Anweisung:
ausblenden 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81



BeitragVerfasst: 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