Entwickler-Ecke

Open Source Units - Konvertierunsunit von BMP, JPG und PNG


Delete - Sa 24.03.07 13:34
Titel: Konvertierunsunit von BMP, JPG und PNG
Moderiert von user profile iconChristian S.: Bitte hier [http://www.delphi-forum.de/viewtopic.php?t=71359] weitermachen


PictureConvert

Mit dieser Unit könnt ihr die Dateitypen BMP, PNG und JPG umwandeln. Ich habe die einzelnen Prozeduren und Funkionen noch einmal näher erläutert, darum werde ich hier nichts mehr erklären.

Hinweis: Erst die Unit im Anhang installieren (in den Lib-Pfad von Delphi), und dann ausprobieren


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
//-------------------------------------------------------------------------
//------------------------ Bildkonverter ----------------------------------
//-------------------------------------------------------------------------
//----------------------- (C) 2007 by Yogu --------------------------------
//-------------------------------------------------------------------------
//---- Konvertiert die Dateitypen BMP, PNG und JPG in BMP, PNG und JPG ----
//-------------------------------------------------------------------------

unit PictureConvert;

interface

//       Standart          BMP      PNG      JPG
uses SysUtils, Dialogs, Graphics, PNGImage, JPEG;

type  //Bildtyp  NIL     BMP    PNG    JPG
  TPictureType=(ptNone, ptBMP, ptPNG, ptJPG);

//Konvertiert eine Bilddatei 'Source' in die Datei 'Dest' mit dem
//Bilddateityp 'PictureType'. Wenn keine 'Dest'-Datei angegeben ist,
//wird die 'Source'-Datei mit der entsprechenden Endung genommen. Wenn
//kein Typ in 'Dest' angegeben ist, wird dieser entsprechend 'PictureType'
//angehängt.
procedure ConvertPicture(Source, Dest: String; PictureType: TPictureType);

//Lädt eine BMP-Datei und gibt diese als TBitmap zurück
function LoadBMPFromFile(const FileName: String): TBitmap;

//Lädt eine PNG-Datei und gibt diese als TBitmap zurück
function LoadPNGFromFile(const FileName: String): TBitmap;

//Lädt eine JPG-Datei und gibt diese als TBitmap zurück
function LoadJPGFromFile(const FileName: String): TBitmap;

//Speichert eine TBitmap als BMP
procedure SaveBMPToFile(Picture: TBitmap; FileName: String);

//Speichert eine TBitmap als PNG
procedure SavePNGToFile(Picture: TBitmap; FileName: String);

//Speichert eine TBitmap als JPG
procedure SaveJPGToFile(Picture: TBitmap; FileName: String);

implementation

procedure ConvertPicture(Source, Dest: String; PictureType: TPictureType);
var Ext: String; Picture: TBitmap;
begin
  //Fals Zieldatei '', Sourcedatei ohne Endung
  if Dest = '' then
    Dest := Copy(Source, 0, Length(Source)-Length(Ext));
  //Richtuge Endung hinzufügen, falls keine angegeben
  if ExtractFileExt(Dest) = '' then
  begin
    if PictureType = ptBMP then Dest := Dest + '.bmp';
    if PictureType = ptPNG then Dest := Dest + '.png';
    if PictureType = ptJPG then Dest := Dest + '.jpg';
  end;

  //Endung der Sorucedatei ermitteln
  Ext := LowerCase(ExtractFileExt(Source));
  //'jpeg' als 'jpg', weil das gleiche
  if Ext = '.jpeg' then Ext := '.jpg';
  //Bild erzeugen, falls keins geladen wird
  Picture := TBitmap.Create;

  //Richtigen Bildtyp laden
  if Ext = '.bmp' then Picture := LoadBMPFromFile(Source);
  if Ext = '.png' then Picture := LoadPNGFromFile(Source);
  if Ext = '.jpg' then Picture := LoadJPGFromFile(Source);

  //Als PictureType speichern
  if PictureType = ptBMP then SaveBMPToFile(Picture, Dest);     
  if PictureType = ptPNG then SavePNGToFile(Picture, Dest);
  if PictureType = ptJPG then SaveJPGToFile(Picture, Dest);
end;

function LoadBMPFromFile(const FileName: String): TBitmap;
begin
  //Bild erzeugen
  Result := TBitmap.Create;
  try
    //Bild laden, falls vorhanden
    Result.LoadFromFile(FileName);
  finally
  end;
end;

function LoadPNGFromFile(const FileName: String): TBitmap;
var PNG: TPNGObject;
begin
  //PNG und Bild erzeugen
  PNG := TPNGObject.Create;
  Result := TBitmap.Create;
  try
    //PNG laden, falls vorhanden
    PNG.LoadFromFile(FileName);
    //PNG Bild zuweisen
    Result.Assign(PNG);
  finally
    //PNG wieder freigeben
    PNG.Free;
  end;
end;

function LoadJPGFromFile(const FileName: String): TBitmap;
var JPG: TJPEGImage;
begin
  //JPG und Bild erzeugen
  JPG := TJPEGImage.Create;
  Result := TBitmap.Create;
  try
    //JPG laden, falls vorhanden
    JPG.LoadFromFile(FileName);
    //JPG Bild zuweisen
    Result.Assign(JPG);
  finally
    //JPG wieder löschen
    JPG.Free;
  end;
end;

procedure SaveBMPToFile(Picture: TBitmap; FileName: String);
begin
  try
    //Falls möglich, Bild speichern
    Picture.SaveToFile(FileName);
  finally
  end;
end;

procedure SavePNGToFile(Picture: TBitmap; FileName: String);
var PNG: TPNGObject;
begin
  //PNG erzeugen
  PNG := TPNGObject.Create;
  try
    //Bild PNG zuweisen
    PNG.Assign(Picture);
    //PNG speichern
    PNG.SaveToFile(FileName);
  finally
    //PNG wieder freigeben
    PNG.Free;
  end;
end;

procedure SaveJPGToFile(Picture: TBitmap; FileName: String);
var JPG: TJPEGImage;
begin
  //JPG erzeugen
  JPG := TJPEGImage.Create;
  try
    //Bild JPG zuweisen
    JPG.Assign(Picture);
    //JPG speichern
    JPG.SaveToFile(FileName);
  finally
    //JPG wieder freigeben
    JPG.Free;
  end;
end;

end.


Marco D. - Sa 24.03.07 14:34

Hört sich erstmal nicht schlecht an.
Mal sehen, ob sie funktioniert und ich sie brauchen kann. ;)


jakobwenzel - Sa 24.03.07 15:45

Da sind n paar Fehler drin (Alle in der Prozedur ConvertPicture):


Christian S. - So 25.03.07 20:02

Da user profile iconYogu wieder seinen richtige Account nutzen kann, haben wir ihn gebeten, seine Unit unter diesem Account zu erstellen. Das ist hier [http://www.delphi-forum.de/topic_Konvertierunsunit+von+BMP+JPG+und+PNG_71359.html] zu finden.

Letztens gab es beim Zusammenführen von Threads einen Bug, den ich mir erst angucken will, daher bleiben diese Beiträge erst einmal hier.