OPBitmap 1.0

Zur Vorstellung von Komponenten und Units für Lazarus
pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

du könntest ja sows wie BitMap32 klasse machen von Delphi oder ?
eine komplette klasse die mehr kann als die stand art und auch besser kann als die stand art klasse.

ich hoffe du weißt wie ich das meine !
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

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.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Du kannst doch auch beim lazarus TPicuture transparenz mit mehr als einer 1 bit maske verwenden pluto
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

wie das den ?
habe ich noch nie gemacht!
ich dachte die Tbitmap kann sowas nicht !
Dort habe ich bis jetzt nur sowas gefunden wie Tranzparent an und mit der angeben Farbe wobei das kein durchschmmern tranzparent ist !

Kannst du mir davon mal ein beispiel geben ?
MFG
Michael Springwald

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

Hey Theo!

Alles Gute zu deinem Geburtstag auch von mir!

Bei deinem Tool begeistert mich besonders die Qualität des Resamplings. Die Bilder werden ja kein bisschen Pixelig...


Viele Grüße, Euklid

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

@Pluto die Lazarus TBitmap kann das inern schon die Delphi bitmap kanns nicht ... png kann ja auch echte transparenz und das auch mit den fpc reader /writer routinen
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Euklid hat geschrieben:Hey Theo!
Alles Gute zu deinem Geburtstag auch von mir!

Danke!
Euklid hat geschrieben:Bei deinem Tool begeistert mich besonders die Qualität des Resamplings. Die Bilder werden ja kein bisschen Pixelig...

Danke. Aber diese Lorbeeren gehen an Anders Melander und Mike Lischke.
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
Und klar: Für euch habe ich nur die besten Codes ausgewählt ;-)

schnullerbacke
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

Beitrag von schnullerbacke »

@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.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

schnullerbacke hat geschrieben:@theo
Hast Du bei der opexe GIFImage von A. Mellander direkt benutzt?


Nö, die ist mir zu VCL/Windows lastig. Ich habe John M. Miano's GIFimage zum lesen verwendet.
Das ist so ne Sache mit den AniGIF Tempi. Da waren sich früher nicht mal die Webbrowser einig ;-)

schnullerbacke
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

Beitrag von schnullerbacke »

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.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

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.

schnullerbacke
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

Beitrag von schnullerbacke »

:lol:

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. :lol:

Hast Du die GraphicEX von Mike Lischke verwendet?
Dateianhänge
exhibitionist.zip
Nur für Erwachsene!!!!!
(54.42 KiB) 75-mal heruntergeladen
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

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. :lol:


Das Tempo ist bei mir schon richtig, aber ich habe die Verzögerung am falschen Ort eingebaut.
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.

schnullerbacke hat geschrieben:Hast Du die GraphicEX von Mike Lischke verwendet?

Auch, aber nicht für GIF, PNG, JPEG, BMP

schnullerbacke
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

Beitrag von schnullerbacke »

@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?
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

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?


Verstehe deine Frage nicht wirklich. Welches Rad willst du denn nochmal erfinden?
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;


Ist also bis zum letzten Moment alles völlig "losgelöst" vom Widgetset.

Antworten