Autor |
Beitrag |
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mi 21.03.07 19:20
Wie konvertiere ich eine Bitmap in das PNG-Format?[meta]PNG, GIF, BMP, Konvertieren, Konvertierung, Transparenz, Halbtransparenz[/meta]
Lösung: [url=www.delphi-forum.de/...PictureConvert[/url]
Hallo!
Also, ich will einen Homepage-Gestalter programmieren, aber bis jetzt muss ich die Bilder immer im BMP-Format speichern, weil die automatisch erzeugt werden (z.B. beschriftete Buttons). Aber im Web sind BMPs einfach doof.
Kennt jemand eine Komponente, Prozedur oder sowas in Delphi, die PNGs unterstützt?
Auch gut wäre eine EXE, die man mit Parameter starten kann, und die dann ohne viel anzuzeigen einfach die angegebene BMP in PNG umwandelt? Zur Not würd auch GIF gehen, aber GIF ist immer noch etwas größer als PNG.
Vielen Dank schonmal für die Antworten.
Ach ja, wenn jemand weiß, wie Transparenz in GIF- und PNG-Dateien eingefügt wird, die Frage ist immer noch offen.
MfG, Yogu
Zuletzt bearbeitet von Yogu am Sa 29.12.07 18:16, insgesamt 6-mal bearbeitet
|
|
Fighter#1
      
Beiträge: 787
Win XP, Ubuntu 8.04
Turbo Delphi 2006, Delphi 2005 Pe, Delphi 5 Pe, Netbeans 6.1, Eclipse, Microsoft VisualC#, Dev C++, PHP, HTML, CSS
|
Verfasst: Mi 21.03.07 19:40
Also, such bei Google einfach mal Delphi und PNG dort findest du:
pngdelphi.sourceforge.net/
Da lädst du die Komponente runter und bindest sie ins Programm ein, so kannst du Bilder im PNG Format laden und speichern (ganz normal im Image1)
_________________ Wer andere beherrscht ist stark,
wer sich selbst beherrscht ist mächtig. Lao Tse
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: Do 22.03.07 10:18
Hallo,
nicht-transparente Bilder speichert man im Web für gewöhnlich im Format JPEG und das wird schon von Haus aus in der Unit jpeg mitgeliefert.
Für jene anderen hast du ja jetzt den Link ein Beitrag weiter oben!
Gruß Hape!
|
|
Yogu 
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Do 22.03.07 20:09
wulfskin hat folgendes geschrieben: | Hallo,
nicht-transparente Bilder speichert man im Web für gewöhnlich im Format JPEG und das wird schon von Haus aus in der Unit jpeg mitgeliefert.
Für jene anderen hast du ja jetzt den Link ein Beitrag weiter oben!
Gruß Hape! |
Ich habe ja nicht gegen JPEG, wenn es um Fotos geht, aber für alles, was irgendwelche Farbverläufe oder Farbflächen hat, ist meiner Meinung nach JPEG nicht die richtige Wahl. Die Buttons und so sehen einfach viel schlechter aus, als sie eigentlich sind, weil überall die Ränder pixelig sind. PNG ist außerdem mehr als 10% kleiner als JPG, deshalb für Web einfach gut geeignet.
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: Do 22.03.07 20:24
Yogu hat folgendes geschrieben: | PNG ist außerdem mehr als 10% kleiner als JPG, deshalb für Web einfach gut geeignet. |
Das stimmt nicht immer. Bei Bildern mit sehr vielen verschiedeben Farben ist JPG oft besser geeignet.
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
Yogu 
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Do 22.03.07 20:43
Ich hab jetzt diese PNG-Unit kopiert in das Lib-Verzeichnis (stimmt das???). Wenn ich diese pngimage.pas einbinde, erkennt Delphi 3(?) den Befehl overload; nicht. Ist das höheres Delphi? Es kommt nach so einer Prozedur-Dekleration. Wenn ich diesen Befehl entferne, funktioniert soweit alles.
Aber wie laden ich zum Beispiel eine BMP und speichere sie als PNG? Ich sehe nur die Prozeduren LoadFromFile und SaveToFile. Ein Object wie Picture oder so habe ich nicht gefunden. Wie greife ich denn auf das Bild zu?
Wenn ich das Programm starte, kommt die Fehlermeldung, dass die Datei einen falschen Header hat oder so.
Also kurz und knapp: Ich hätte gerne ein Beispiel für Delphi 3(!)
|
|
Danniolo
      
Beiträge: 693
|
Verfasst: Do 22.03.07 20:46
Aus der pngdelphi-Dokumentation: | 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:
| uses pngimage;
procedure BitmapFileToPNG(const Source, Dest: String); var Bitmap: TBitmap; PNG: TPNGObject; begin Bitmap := TBitmap.Create; PNG := TPNGObject.Create; try Bitmap.LoadFromFile(Source); PNG.Assign(Bitmap); PNG.SaveToFile(Dest); finally Bitmap.Free; PNG.Free; end end;
procedure PNGFileToBitmap(const Source, Dest: String); var Bitmap: TBitmap; PNG: TPNGObject; begin PNG := TPNGObject.Create; Bitmap := TBitmap.Create; try PNG.LoadFromFile(Source); Bitmap.Assign(PNG); Bitmap.SaveToFile(Dest); finally PNG.Free; Bitmap.Free; end end; | |
|
|
Yogu 
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Do 22.03.07 20:54
Danke, Danniolo!
Auf Assign wäre ich garnicht draufgekommen. Ich hätte gedacht, tpngimage ist so wie timage.
Edit:
Naja, doch nicht so ganz. Wie krieg ich die Unit pngimage kompatibel zu Delphi 3? Ich hatte ja schon das overload; erwähnt. Oder ist Delphi 3 einfach out und nicht geht mehr damit?
Aber trotzdem Danke für Danniolo.
|
|
Danniolo
      
Beiträge: 693
|
Verfasst: Do 22.03.07 21:14
|
|
Yogu 
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Do 22.03.07 21:43
|
|
Danniolo
      
Beiträge: 693
|
Verfasst: Do 22.03.07 21:45
Wo willst du (Halb-)Transparenz einfügen?
Im Zweifelsfalle einfach ein transparentes PNG laden..
|
|
Yogu 
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Do 22.03.07 21:48
Ich erzeuge mit Delphi eine Bitmap, zum Beispiel für einen Button. Der hat aber runde Ecken, und deshalb will ich außen Transparenz einfügen. Natürlich geht das nicht in der Bitmap, deshalb muss das ja irgendwie mit dem PNG-Objekt gehen (oder auch nicht). Dann speichere ich das komplett automatisch erzeugte Bild als PNG.
|
|
Yogu_
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 24.03.07 13:00
So. Jetzt habe ich ein bisschen rumgebastelt, und das kam raus:
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:
| unit PictureConvert;
interface
uses SysUtils, Dialogs, Graphics, PNGImage, JPEG;
type TPictureType=(ptNone, ptBMP, ptPNG, ptJPG);
procedure ConvertPicture(Source, Dest: String; PictureType: TPictureType);
function LoadBMPFromFile(const FileName: String): TBitmap;
function LoadPNGFromFile(const FileName: String): TBitmap;
function LoadJPGFromFile(const FileName: String): TBitmap;
procedure SaveBMPToFile(Picture: TBitmap; FileName: String);
procedure SavePNGToFile(Picture: TBitmap; FileName: String);
procedure SaveJPGToFile(Picture: TBitmap; FileName: String);
implementation
procedure ConvertPicture(Source, Dest: String; PictureType: TPictureType); var Ext: String; Picture: TBitmap; begin if Dest = '' then Dest := Copy(Source, 0, Length(Source)-Length(Ext)); 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;
Ext := LowerCase(ExtractFileExt(Source)); if Ext = '.jpeg' then Ext := '.jpg'; Picture := TBitmap.Create;
if Ext = '.bmp' then Picture := LoadBMPFromFile(Source); if Ext = '.png' then Picture := LoadPNGFromFile(Source); if Ext = '.jpg' then Picture := LoadJPGFromFile(Source);
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 Result := TBitmap.Create; try Result.LoadFromFile(FileName); finally end; end;
function LoadPNGFromFile(const FileName: String): TBitmap; var PNG: TPNGObject; begin PNG := TPNGObject.Create; Result := TBitmap.Create; try PNG.LoadFromFile(FileName); Result.Assign(PNG); finally PNG.Free; end; end;
function LoadJPGFromFile(const FileName: String): TBitmap; var JPG: TJPEGImage; begin JPG := TJPEGImage.Create; Result := TBitmap.Create; try JPG.LoadFromFile(FileName); Result.Assign(JPG); finally JPG.Free; end; end;
procedure SaveBMPToFile(Picture: TBitmap; FileName: String); begin try Picture.SaveToFile(FileName); finally end; end;
procedure SavePNGToFile(Picture: TBitmap; FileName: String); var PNG: TPNGObject; begin PNG := TPNGObject.Create; try PNG.Assign(Picture); PNG.SaveToFile(FileName); finally PNG.Free; end; end;
procedure SaveJPGToFile(Picture: TBitmap; FileName: String); var JPG: TJPEGImage; begin JPG := TJPEGImage.Create; try JPG.Assign(Picture); JPG.SaveToFile(FileName); finally JPG.Free; end; end;
end. |
Und ein Programm dazu:
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, ComCtrls, StdCtrls, ExtDlgs, PictureConvert;
type TForm1 = class(TForm) FileView: TListView; TopPnl: TPanel; AddBtn: TButton; DeleteBtn: TButton; ConvertBtn: TButton; QuitBtn: TButton; OpenDialog: TOpenPictureDialog; SaveDialog: TSavePictureDialog; procedure FormCreate(Sender: TObject); procedure QuitBtnClick(Sender: TObject); procedure AddBtnClick(Sender: TObject); procedure ConvertBtnClick(Sender: TObject); procedure FormResize(Sender: TObject); procedure FileViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure DeleteBtnClick(Sender: TObject); private public end;
var Form1: TForm1; FileWidth: Extended; TypeWidth: Extended; DirWidth: Extended;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject); begin Application.Title := Caption; FileView.Columns.Items[1].Width := 100; FileView.Columns.Items[2].Width := 300; FileView.Columns.Items[0].Width := FileView.Width-4- FileView.Columns.Items[1].Width-FileView.Columns.Items[2].Width; FileWidth := FileView.Columns.Items[0].Width / (FileView.Width-4); TypeWidth := FileView.Columns.Items[1].Width / (FileView.Width-4); DirWidth := FileView.Columns.Items[2].Width / (FileView.Width-4);
OpenDialog.InitialDir := Application.ExeName; end;
procedure TForm1.QuitBtnClick(Sender: TObject); begin Close; end;
procedure TForm1.AddBtnClick(Sender: TObject); var i: Integer; FileName, FileType, FilePath: String; begin if OpenDialog.Execute then begin for i := 0 to OpenDialog.Files.Count-1 do begin with FileView.Items.Add do begin FileName := ExtractFileName(OpenDialog.Files.Strings[i]); FileType := ExtractFileExt(OpenDialog.Files.Strings[i]); FilePath := ExtractFilePath(OpenDialog.Files.Strings[i]); FileType := Copy(UpperCase(FileType),2,Length(FileType)); Caption := FileName; SubItems.Add(FileType); SubItems.Add(FilePath); end; end; end; end;
procedure TForm1.ConvertBtnClick(Sender: TObject); var i: Integer; FileType: TPictureType; Ext, Source, Dest, Path, FileName: String; begin SaveDialog.InitialDir := OpenDialog.FileName; if SaveDialog.Execute then begin Ext := LowerCase(ExtractFileExt(SaveDialog.FileName)); if Ext = '.jpeg' then Ext := '.jpg'; FileType := ptNone; if Ext = '.bmp' then FileType := ptBMP; if Ext = '.png' then FileType := ptPNG; if Ext = '.jpg' then FileType := ptJPG; if FileType = ptNone then begin if SaveDialog.FilterIndex = 1 then FileType := ptBMP; if SaveDialog.FilterIndex = 2 then FileType := ptPNG; if SaveDialog.FilterIndex = 3 then FileType := ptJPG; end; if FileType = ptNone then begin Application.MessageBox('Der angegebene Dateityp ist kein zugelassener.', 'Fehler in Eingabe', 16); Exit; end; for i := 0 to FileView.Items.Count-1 do begin Source := FileView.Items.Item[i].SubItems[1]+FileView.Items.Item[i].Caption; Path := ExtractFilePath(SaveDialog.FileName); FileName := FileView.Items.Item[i].Caption; Ext := ExtractFileExt(FileName); Dest := Path+Copy(FileName, 0, Length(FileName)-Length(Ext)); ConvertPicture(Source, Dest, FileType); end; end; end;
procedure TForm1.FormResize(Sender: TObject); begin FileView.Columns.Items[0].Width := Round(FileWidth * (FileView.Width-4)); FileView.Columns.Items[1].Width := Round(TypeWidth * (FileView.Width-4)); FileView.Columns.Items[2].Width := Round(DirWidth * (FileView.Width-4)); end;
procedure TForm1.FileViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin FileWidth := FileView.Columns.Items[0].Width / (FileView.Width-4); TypeWidth := FileView.Columns.Items[1].Width / (FileView.Width-4); DirWidth := FileView.Columns.Items[2].Width / (FileView.Width-4); end;
procedure TForm1.DeleteBtnClick(Sender: TObject); var i: Integer; begin for i := 0 to FileView.Items.Count-1 do begin if FileView.Items.Item[i].Selected then FileView.Items.Item[i].Delete; end; end;
end. |
Und das Formular dazu:
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:
| object Form1: TForm1 Left = 256 Top = 140 Width = 696 Height = 480 Caption = 'Bildkonverter' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OnCreate = FormCreate OnResize = FormResize PixelsPerInch = 96 TextHeight = 13 object FileView: TListView Left = 0 Top = 33 Width = 688 Height = 420 Align = alClient Columns = < item Caption = 'Dateiname' Width = 300 end item Caption = 'Dateityp' Width = 100 end item Caption = 'Im Ordner' Width = 200 end> MultiSelect = True OnMouseMove = FileViewMouseMove TabOrder = 0 ViewStyle = vsReport end object TopPnl: TPanel Left = 0 Top = 0 Width = 688 Height = 33 Align = alTop BevelOuter = bvNone TabOrder = 1 object AddBtn: TButton Left = 0 Top = 0 Width = 113 Height = 33 Caption = 'Hinzufügen' Font.Charset = ANSI_CHARSET Font.Color = clWindowText Font.Height = -19 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 0 OnClick = AddBtnClick end object DeleteBtn: TButton Left = 112 Top = 0 Width = 113 Height = 33 Caption = 'Entfernen' Font.Charset = ANSI_CHARSET Font.Color = clWindowText Font.Height = -19 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 1 OnClick = DeleteBtnClick end object ConvertBtn: TButton Left = 224 Top = 0 Width = 113 Height = 33 Caption = 'Konvertieren' Font.Charset = ANSI_CHARSET Font.Color = clWindowText Font.Height = -19 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 2 OnClick = ConvertBtnClick end object QuitBtn: TButton Left = 336 Top = 0 Width = 113 Height = 33 Caption = 'Beenden' Font.Charset = ANSI_CHARSET Font.Color = clWindowText Font.Height = -19 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 3 OnClick = QuitBtnClick end end object OpenDialog: TOpenPictureDialog Filter = 'Alle Bilder (*.bmp; *.png; *.jpg)|*.bmp; *.png; *.jpg; *.jpeg|Bi' + 'tmaps (*.bmp)|*.bmp|Portable Network-Grafiken (*.png)|*.png|JPEG' + ' File Interchange-Format (*.jpg; *.jpeg)|*.jpg; *.jpeg' Options = [ofHideReadOnly, ofAllowMultiSelect, ofPathMustExist, ofFileMustExist] Left = 456 end object SaveDialog: TSavePictureDialog FileName = 'Dateiname wird ignoriert' Filter = 'Bitmaps (*.bmp)|*.bmp|Portable Network-Grafiken (*.png)|*.png|JP' + 'EG File Interchange-Format (*.jpg; *.jpeg)|*.jpg; *.jpeg' Options = [ofHideReadOnly, ofPathMustExist] Left = 488 end end |
PS: Glaubt mir, ich bin schon Yogu, nur tut mein richtiges Konto tut gerade nicht.
|
|
|