OPBitmap 1.0
Tja, ich habe mich mal auf das beschränkt, was mein Ziel war, nämlich Bilddateien lesen.
Du kannst den Canvas gerne erweitern, aber das war eigentlich nicht das Ziel.
Sobald das Bild geladen ist, kannst du es einem Lazarus Bitmap zuweisen und mit dessen Canvas Methoden weiterarbeiten.
Das gleiche gilt für Bitmap32. OPBitmap kann aber nicht nur 32
Natürlich könnte man es als Grundlage für alles Mögliche nehmen,
Aber vieles gibt's ja schon und lässt sich wahrscheinlich recht effizient kombinieren.
Du kannst den Canvas gerne erweitern, aber das war eigentlich nicht das Ziel.
Sobald das Bild geladen ist, kannst du es einem Lazarus Bitmap zuweisen und mit dessen Canvas Methoden weiterarbeiten.
Das gleiche gilt für Bitmap32. OPBitmap kann aber nicht nur 32

Natürlich könnte man es als Grundlage für alles Mögliche nehmen,
Aber vieles gibt's ja schon und lässt sich wahrscheinlich recht effizient kombinieren.
Danke!Euklid hat geschrieben:Hey Theo!
Alles Gute zu deinem Geburtstag auch von mir!
Danke. Aber diese Lorbeeren gehen an Anders Melander und Mike Lischke.Euklid hat geschrieben: Bei deinem Tool begeistert mich besonders die Qualität des Resamplings. Die Bilder werden ja kein bisschen Pixelig...
Mein eigentlicher Beitrag ist die Umwandlung der Pixelformate (inkl. Farb-Quantisierung), und das VCL ähnliche Design, welches den "Einbau" des Resampling Codes ermöglicht.
Überhaupt ist OPBitmap dazu da, alle möglichen Delphi Grafik Codes für X-Platform/Compiler verfügbar zu machen.
Siehe http://www.theo.ch/lazarus/opexe.zip" onclick="window.open(this.href);return false;
Und klar: Für euch habe ich nur die besten Codes ausgewählt

-
- Beiträge: 1187
- Registriert: Mi 13. Dez 2006, 10:58
- OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
- CPU-Target: AMD A4-6400 APU
- Wohnort: Hamburg
@theo
Hast Du bei der opexe GIFImage von A. Mellander direkt benutzt?
Wenn ja, dann müssen wir uns da was für das timing bei den animated GIF's einfallen lassen. Die werden bei Win32 zu schnell abgespielt. Das kenn ich aber schon. Entweder muß man das in Anders Quelle direkt ändern (findet sich ziemlich am Anfang bei Mozilla, da muß man den Wert reduzieren) oder wir müssen mal über IFDEF's nachdenken. Das rast sonst mit dem 10fachen Tempo durch.
Hast Du bei der opexe GIFImage von A. Mellander direkt benutzt?
Wenn ja, dann müssen wir uns da was für das timing bei den animated GIF's einfallen lassen. Die werden bei Win32 zu schnell abgespielt. Das kenn ich aber schon. Entweder muß man das in Anders Quelle direkt ändern (findet sich ziemlich am Anfang bei Mozilla, da muß man den Wert reduzieren) oder wir müssen mal über IFDEF's nachdenken. Das rast sonst mit dem 10fachen Tempo durch.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.
(Ringelnatz)
(Ringelnatz)
-
- Beiträge: 1187
- Registriert: Mi 13. Dez 2006, 10:58
- OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
- CPU-Target: AMD A4-6400 APU
- Wohnort: Hamburg
Ist auch noch so, im Mozilla werden die schneller abgespielt als beim ie. Bei Mellanders GIFImage rauscht das Ding unter Delphi wie beim Mozilla durch und flickert dadurch. Das ist bei deiner opexe aber auch so, wie ich gerade gesehen hab.
Bei Mellander's hab den Delay von 3 auf 20 raufgesetzt, dann sieht es ordentlich aus.
Bei Mellander's hab den Delay von 3 auf 20 raufgesetzt, dann sieht es ordentlich aus.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.
(Ringelnatz)
(Ringelnatz)
Ist auch bei der vorliegenden Version mit Faktor 10 multipliziert. Die Delays sind aber vom Gif definiert. Also fixe Werte würde ich nicht nehmen.
Und dann kommt's noch auf's GIF an. Meine Test GIF's laufen vernünftig.
Vielleicht ist dein GIF auch etwas seltsam...
Aber da reiss ich mir im Moment kein Bein aus.
Und dann kommt's noch auf's GIF an. Meine Test GIF's laufen vernünftig.
Vielleicht ist dein GIF auch etwas seltsam...

Aber da reiss ich mir im Moment kein Bein aus.
-
- Beiträge: 1187
- Registriert: Mi 13. Dez 2006, 10:58
- OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
- CPU-Target: AMD A4-6400 APU
- Wohnort: Hamburg

Dann liegt das wohl an meiner Maschine. Die machen das alle so. Guck dir mal das im Attach an. Wenn dem Herren der Lolli nicht vor's Gesicht klatscht, dann ist es zu schnell.

Hast Du die GraphicEX von Mike Lischke verwendet?
- Dateianhänge
-
exhibitionist.zip
- Nur für Erwachsene!!!!!
- (54.42 KiB) 87-mal heruntergeladen
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.
(Ringelnatz)
(Ringelnatz)
Das Tempo ist bei mir schon richtig, aber ich habe die Verzögerung am falschen Ort eingebaut.schnullerbacke hat geschrieben: Dann liegt das wohl an meiner Maschine. Die machen das alle so. Guck dir mal das im Attach an. Wenn dem Herren der Lolli nicht vor's Gesicht klatscht, dann ist es zu schnell.![]()
Es wartet nach dem letzten Bild nicht. Das kann ich leicht ändern.
Die reinste Tüftlerei mit diesen AniGIFs, das mache ich später mal noch besser.
Auch, aber nicht für GIF, PNG, JPEG, BMPschnullerbacke hat geschrieben: Hast Du die GraphicEX von Mike Lischke verwendet?
-
- Beiträge: 1187
- Registriert: Mi 13. Dez 2006, 10:58
- OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
- CPU-Target: AMD A4-6400 APU
- Wohnort: Hamburg
Verstehe deine Frage nicht wirklich. Welches Rad willst du denn nochmal erfinden?schnullerbacke hat geschrieben:@theo
Hast Du denn dafür schon ein TGIFImage von TGraphic abgeleitet? Nicht das ich jetzt das Rad nochmal erfinde.
Und welche anderen Formate fehlen dann noch?
Grundsätzlich kannst du wählen, ob du OpBitmap von TGraphic ableiten willst.
Es gibt dazu einen Switch in OpBitmap.pas:
{$DEFINE IMPORTTGRAPHIC}//Import TGraphic Class
In diesem Moment bindest du aber die Graphics.pas ein, und dadurch natürlich Abhängigkeiten von der LCL.
Ich nehme jetzt mal an du sprichst von AniGif?
Prinzipiell bietet der GIF-Reader alle Informationen die zum darstellen von AniGIF gebraucht werden.
Aber es ist nicht fixfertig gekapselt. Du kannst also z.B. mit Threads oder Timer arbeiten.
In der Demo, die ich mal gemacht habe, sieht Gif-Thread-Execute so aus:
Code: Alles auswählen
procedure TGifThread.Execute;
var gif: TGifDecoder;
repeatmode: boolean;
begin
try
try
repeatmode := false;
fimage := TOPBitmap.Create;
gif := TGifDecoder.Create;
gif.Verbose := false;
gif.MultiImageMode := true;
repeat
gif.Reset; ;
gif.ReadImageFile(FileName, image);
if TransparentColorFlag(gif.graphicCtrlblock) then
image.TransparentColor := image.ColorTable^[gif.GraphicCtrlBlock.transparent_color];
UpdateDims(gif.GifImgDescriptor);
fFirstWidth:=fWidth;
fFirstHeight:=fHeight;
if not Terminated then Synchronize(@Update);
if gif.moreImages and gif.MultiImageMode then repeatmode := true;
if repeatmode then sleep(gif.GraphicCtrlBlock.delay_time * 10);
while gif.moreImages and gif.MultiImageMode and (not Terminated) do
begin
if not Terminated then gif.readNextImage(image);
if TransparentColorFlag(gif.graphicCtrlblock) then
image.TransparentColor := image.ColorTable^[gif.GraphicCtrlBlock.transparent_color];
fDisposalMethod := DisposalMethod(gif.GraphicCtrlBlock);
UpdateDims(gif.GifImgDescriptor);
if not Terminated then Synchronize(@Update);
sleep(gif.GraphicCtrlBlock.delay_time * 10);
end;
until (not repeatmode) or Terminated;
except
Terminate;
end;
finally
image.Destroy;
gif.Destroy;
end;
end;