JPEG, PNG, GIF - Resize
Re: JPEG, PNG, GIF - Resize
Der Code ist in gifwrite.pas. Den kannst du dir gerne anschauen.
Die Grafikformat Codes stammen ja nicht von mir. Der Beweggrund für OpBitmap war ja, Grafikcode der für Delphi geschrieben war in Lazarus zu verwenden, ohne viel Anpassungsarbeit bei den Fremdcodes.
Die Grafikformat Codes stammen ja nicht von mir. Der Beweggrund für OpBitmap war ja, Grafikcode der für Delphi geschrieben war in Lazarus zu verwenden, ohne viel Anpassungsarbeit bei den Fremdcodes.
-
- Beiträge: 298
- Registriert: Di 23. Nov 2010, 23:41
- OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
- CPU-Target: 32Bit/64Bit
- Wohnort: Geldern
- Kontaktdaten:
Re: JPEG, PNG, GIF - Resize
Wo der Code drin steht hatte ich schon durch Debug herausgefunden und den Fehler auch, unsere Nachrichten haben sich wohl etwas durch meine Korrekturen überschnitten, also einfach noch einmal am Ende meine letzten Meldung nachsehen, dann ist bei Dir der Fehler auch raus.
Übrigens ich hasse Ihn auch, den Internet Explorer, aber dieser Browser der leider noch eine hohe Verbreitung hat konnte das Bild auch nicht anzeigen!
Übrigens die Erweiterung macht in der kompilierten Datei 491kb aus das ist mehr als eine Verdopplung der ursprünglichen Dateigröße!
Bildgröße Ursprungsbild 800x600 Zielgröße: 160x107 in 109ms ist glaube ich ok!
Übrigens ich hasse Ihn auch, den Internet Explorer, aber dieser Browser der leider noch eine hohe Verbreitung hat konnte das Bild auch nicht anzeigen!
Übrigens die Erweiterung macht in der kompilierten Datei 491kb aus das ist mehr als eine Verdopplung der ursprünglichen Dateigröße!
Bildgröße Ursprungsbild 800x600 Zielgröße: 160x107 in 109ms ist glaube ich ok!
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
Re: JPEG, PNG, GIF - Resize
Danke, sehr gut. Das ging ja schnell. Werde ich nächstens in die Download-Version einbauen.gocher hat geschrieben:Wo der Code drin steht hatte ich schon durch Debug herausgefunden und den Fehler auch, unsere Nachrichten haben sich wohl etwas durch meine Korrekturen überschnitten, also einfach noch einmal am Ende meine letzten Meldung nachsehen, dann ist bei Dir der Fehler auch raus.
Verstehe nicht ganz. Das hängt von mit der Ursprungsqualität zusammen. Resampling transformiert immer auf 32 bit.gocher hat geschrieben: Übrigens die Erweiterung macht in der kompilierten Datei 491kb aus das ist mehr als eine Verdopplung der ursprünglichen Dateigröße!
Wenn du nachher auf 16 Farben runter willst, geht das so:
Code: Alles auswählen
bmp := TOPPicture.create;
bmp.LoadFromFile('/home/theo/Bildschirmfoto3.png');
bmp.Bitmap.Canvas.Resample(160,109);
bmp.Bitmap.ReductionMode:=rmOptimized; //<<<
bmp.Bitmap.PixelFormat:=pf4bit; //<<<
bmp.SaveToFile('/home/theo/Bildschirmfoto3.gif');
bmp.free;
Zuletzt geändert von theo am So 6. Okt 2013, 17:40, insgesamt 1-mal geändert.
-
- Beiträge: 298
- Registriert: Di 23. Nov 2010, 23:41
- OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
- CPU-Target: 32Bit/64Bit
- Wohnort: Geldern
- Kontaktdaten:
Re: JPEG, PNG, GIF - Resize
Ich glaube das hast Du falsch verstanden, das Package OpBitmap mach die .dll/.exe 491kb größer!
Das Bild ist ist ok!!!
Das Bild ist ist ok!!!
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
Re: JPEG, PNG, GIF - Resize
Ist aber trotzdem ein guter Tipp, gerade bei Thumbnails dieser Grösse ist die Farbtreue nicht so wichtig, macht aber glatt ein halb so fettes GIF.gocher hat geschrieben:Ich glaube das hast Du falsch verstanden, das Package OpBitmap mach die .dll/.exe 491kb größer!
Das Bild ist ist ok!!!

Du kannst das Package beliebig auseinanderpflücken. Eigentlich brauchst du nur opbitmap.pas und gifwrite.pas, sowie resample, ftbresenham und wincomp.
-
- Beiträge: 298
- Registriert: Di 23. Nov 2010, 23:41
- OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
- CPU-Target: 32Bit/64Bit
- Wohnort: Geldern
- Kontaktdaten:
Re: JPEG, PNG, GIF - Resize
Für kleine Skizzen, Grafiken, Comics, etc. aber nicht für kleine Bilder, obwohl es hat schon wieder was künstlerisches
!

MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
Re: JPEG, PNG, GIF - Resize
gocher hat geschrieben:Für kleine Skizzen, Grafiken, Comics, etc. aber nicht für kleine Bilder, obwohl es hat schon wieder was künstlerisches!


Klar, kommt halt auf den Zweck und die Prioritäten an. Erkennen tut man das Bild.
-
- Beiträge: 298
- Registriert: Di 23. Nov 2010, 23:41
- OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
- CPU-Target: 32Bit/64Bit
- Wohnort: Geldern
- Kontaktdaten:
Re: JPEG, PNG, GIF - Resize
Wenn ich das Package richtig verstehe wird TOPPicture in der Unit opbitmapformats zur Verfügung gestellt, ohne geht nicht oder?theo hat geschrieben:Du kannst das Package beliebig auseinanderpflücken. Eigentlich brauchst du nur opbitmap.pas und gifwrite.pas, sowie resample, ftbresenham und wincomp.
Somit geht das nicht mit dem Auseinanderpflücken.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
Re: JPEG, PNG, GIF - Resize
Doch natürlich geht ohne, wenn du unbedingt ausmisten willst. Es ist aber dann nicht mehr so komfortabel.
Diesen Code aus opbitmapformats kannst du auch ohne diese Unit gebrauchen. "Self" bei AddBitmap ist einfach ein TOpBitmap (bzw. ein TCanvasOPBitmap)
Diesen Code aus opbitmapformats kannst du auch ohne diese Unit gebrauchen. "Self" bei AddBitmap ist einfach ein TOpBitmap (bzw. ein TCanvasOPBitmap)
Code: Alles auswählen
procedure TGIFImage.SaveToStream(Stream: TStream);
begin
if Empty then raise EPasBitMapError.Create('OPBitmap empty');
PixelFormat := pf8bit;
Stream.Position := 0;
fEncoder := TGif.Create;
fEncoder.AddBitmap(self);
if Transparent then
fEncoder.TransparentColor := Transparentcolor;
fEncoder.Interlaced := fInterlaced;
fEncoder.SaveToStream(Stream);
fEncoder.free;
end;
-
- Beiträge: 298
- Registriert: Di 23. Nov 2010, 23:41
- OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
- CPU-Target: 32Bit/64Bit
- Wohnort: Geldern
- Kontaktdaten:
Re: JPEG, PNG, GIF - Resize
Jop, hat geklappt ich habe nun eine Klasse TFPWriterGIF (fpwritegif.pas) angelegt, die benötigt die Dateien opbitmap.pas, bmp.pas, bitmapimage, gifwrite.pas, gif.pas, gifdecoder.pas, gifInputfilestream.pas, gifinputstream.pas, giftype.pas, inputbytestream.pas und systemspecific.pas.
Jetzt ist die .dll/.exe nur 68kb größer, nicht mehr 491kb - aber 125ms Bearbeitungszeit, das sind 16ms mehr!!!
So die abgespeckte Variante ist nun auch fertig, sie macht die .dll/.exe nun 83kb größer - aber 109ms Bearbeitungszeit!
Der umgekehrte Weg wäre natürlich auch noch interessant, die Thumbnail-Routine in OpBitmap einzubauen!
Für die unter Euch die Interesse an diesem Thread gefunden habe und sich schon lange die Klasse TFPWrieGIF gewünscht haben nun ein kleines Abfallprodukt
.
Jetzt ist die .dll/.exe nur 68kb größer, nicht mehr 491kb - aber 125ms Bearbeitungszeit, das sind 16ms mehr!!!
So die abgespeckte Variante ist nun auch fertig, sie macht die .dll/.exe nun 83kb größer - aber 109ms Bearbeitungszeit!
Der umgekehrte Weg wäre natürlich auch noch interessant, die Thumbnail-Routine in OpBitmap einzubauen!
Für die unter Euch die Interesse an diesem Thread gefunden habe und sich schon lange die Klasse TFPWrieGIF gewünscht haben nun ein kleines Abfallprodukt

MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
-
- Beiträge: 298
- Registriert: Di 23. Nov 2010, 23:41
- OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
- CPU-Target: 32Bit/64Bit
- Wohnort: Geldern
- Kontaktdaten:
Re: JPEG, PNG, GIF - Resize
Hallo Theo, damit auch das Setzen von bmp.fCurrentFormat.Monochrome := false; möglich ist und vor allem nicht zu einem Fehler führt!
opbitmap.pas:
opbitmap.pas:
Code: Alles auswählen
procedure TOPBitmap.SetMonochrome(const Value: Boolean);
var x, y: integer;
gray: Byte;
col: TColor;
OrigPixelFormat:TPixelFormat;
begin
if Value and not fMonochrome then //***neu
begin
OrigPixelFormat:=PixelFormat;
if PixelFormat<pf15bit then PixelFormat:=pf24bit;
// fMonochrome := True; //***neu
for y := 0 to Height - 1 do
for x := 0 to Width - 1 do
begin
col := Pixels[x, y];
gray := (Byte(col) * 77 + Byte(col shr 8) * 151 + Byte(col shr 16) * 28) shr 8;
Pixels[x, y] := gray shl 16 + gray shl 8 + gray;
end;
PixelFormat:=OrigPixelFormat;
end;
fMonochrome := Value; //***neu
end;
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
Re: JPEG, PNG, GIF - Resize
Zu welchem Fehler führt das denn?gocher hat geschrieben:Hallo Theo, damit auch das Setzen von bmp.fCurrentFormat.Monochrome := false; möglich ist und vor allem nicht zu einem Fehler führt!
Kann man so machen wie du vorschlägst, aber in welchem Szenario ergibt das Sinn?
Mmn sollte es eig. nur ein SetMonochrome geben, denn das ist ja nicht reversibel.
Aus Kompatibilitätsgründen (Delphi) habe ich es aber als Property realisiert.
Aber ich gebe zu, das ist etwas halbherzig umgesetzt.
-
- Beiträge: 298
- Registriert: Di 23. Nov 2010, 23:41
- OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
- CPU-Target: 32Bit/64Bit
- Wohnort: Geldern
- Kontaktdaten:
Re: JPEG, PNG, GIF - Resize
Also Du hast Monochrom als Property realisiert, aber beim setzen (write) wird immer die Methode SetMonochrom aufgerufen und in der wurde immer nach Monochrom konvertiert und dann der Wert auf True gesetzt!theo hat geschrieben:Zu welchem Fehler führt das denn?
Kann man so machen wie du vorschlägst, aber in welchem Szenario ergibt das Sinn?
Mmn sollte es eig. nur ein SetMonochrome geben, denn das ist ja nicht reversibel.
Aus Kompatibilitätsgründen (Delphi) habe ich es aber als Property realisiert.
Aber ich gebe zu, das ist etwas halbherzig umgesetzt.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
Re: JPEG, PNG, GIF - Resize
Ist schon klar, dass das grenzwertig ist.
Andererseits was soll denn Monochrome:=false bewirken? Wird das Bild dann farbig?
Bzw. was soll das Property überhaupt?
Andererseits was soll denn Monochrome:=false bewirken? Wird das Bild dann farbig?
Bzw. was soll das Property überhaupt?
-
- Beiträge: 298
- Registriert: Di 23. Nov 2010, 23:41
- OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
- CPU-Target: 32Bit/64Bit
- Wohnort: Geldern
- Kontaktdaten:
Re: JPEG, PNG, GIF - Resize
Also wenn man die Komponente irgendwo einsetzt und man optional eine Konvertierung nach Monochrome möchte wie z.B. im Beispiel:
Da aber schon das Setzen des Wertes zur Konvertierung führt, auch wenn der Wert false ist sehe ich da ein Problem!
Sonst sollte Monochrome nicht als Property angeboten werden, sondern nur eine Funktion.
Die kleinen Änderungen verhindern diesen Fehler und machen das Property abfragbar vorher stand der Wert nach dem Setzen immer auf True.
Code: Alles auswählen
procedure TFPWriterGIF.InternalWrite(Str: TStream; Img: TFPCustomImage);
var
opbmp: TOPPicture;
MemoryStream: TMemoryStream;
Writer: TFPWriterBMP;
begin
MemoryStream := TMemoryStream.Create;
Writer := TFPWriterBMP.Create;
Writer.BitsPerPixel := 32;
opbmp := TOPPicture.create;
Writer.ImageWrite(MemoryStream, TheImage);
opbmp.LoadFromStream(MemoryStream);
case fBitsPerPixel of //property from wrapper class
4: begin
opbmp.fCurrentFormat.PixelFormat := pf4bit;
opbmp.fCurrentFormat.ReductionMode := rmOptimized;
end;
8: opbmp.fCurrentFormat.PixelFormat := pf8bit;
else opbmp.fCurrentFormat.PixelFormat:=pf8bit;
end;
opbmp.fCurrentFormat.Monochrome := fMonochrome; //property from wrapper class <--*** hier: Wert wird durchgereicht
opbmp.SaveToStream(Str);
opbmp.free;
FreeAndNil(Writer);
MemoryStream.Free;
end;
Sonst sollte Monochrome nicht als Property angeboten werden, sondern nur eine Funktion.
Die kleinen Änderungen verhindern diesen Fehler und machen das Property abfragbar vorher stand der Wert nach dem Setzen immer auf True.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me