Probleme bei der Einbindung von OPBitmap

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Probleme bei der Einbindung von OPBitmap

Beitrag von br_klaus »

Hallo, Theo, ich habe da ein kleines Problem mit TOpBitmap

Wenn ich
Uses OPBitmapForLaz
eingebe, dann gibt der Compiler bei der Unit LazOpGIF Fehlermeldungen aus:
bei der procedure TFPReaderGIF.InternalRead:

Code: Alles auswählen

E:\LAZARUS\opbitmap1_7\imglibs\lazopgif.pas(115,37) Error: Incompatible type for arg no. 1: Got "OPBITMAP.TPixelFormat", expected "GRAPHICS.TPixelFormat"

und noch viele weitere:

Code: Alles auswählen

E:\LAZARUS\opbitmap1_7\imglibs\lazopgif.pas(12,21) Hint: Type "TSharedGIFImage" redefinition
E:\LAZARUS\opbitmap1_7\imglibs\lazopgif.pas(112,25) Warning: Constructing a class "TGIFImage" with abstract method "GetWriterClass"
E:\LAZARUS\opbitmap1_7\imglibs\lazopgif.pas(115,37) Error: Incompatible type for arg no. 1: Got "OPBITMAP.TPixelFormat", expected "GRAPHICS.TPixelFormat"
E:\LAZARUS\opbitmap1_7\imglibs\lazopgif.pas(116,28) Error: identifier idents no member "SetAlpha"
E:\LAZARUS\opbitmap1_7\imglibs\lazopgif.pas(120,61) Error: identifier idents no member "Data"
E:\LAZARUS\opbitmap1_7\imglibs\lazopgif.pas(149,25) Warning: Constructing a class "TGIFImage" with abstract method "GetWriterClass"
E:\LAZARUS\opbitmap1_7\imglibs\lazopgif.pas(155,10) Error: identifier idents no member "Pixels"
E:\LAZARUS\opbitmap1_7\imglibs\lazopgif.pas(174) Fatal: There were 4 errors compiling module, stopping


Was mache ich da verkehrt?

Außerdem eine Frage: gibt es irgendwo eine Hilfe, um zu wissen, wie man OPBitmap gebrauchen kann?
Ich möchte zB aus einer Bitmap eine TeilBitmap extrahieren. Finde aber nur CopyRect mit einem Canvas.
Es wäre gut (ähnlich wie in der Unit WinGraph), eine kleine HTML- oder CHM-Hilfe zu erstellen. Dann könnte man sich da leichter einarbeiten.
Herzlichen Dank!
P. Nikolaus

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Probleme bei der Einbindung von OPBitmap

Beitrag von br_klaus »

Jetzt habe ich ein weiteres Problem: Wie kann ich bei einer TopPicture auf die Pixeldaten zugreifen?
Ich habe folgende Situation (Laden einer existerenden Datei).

Code: Alles auswählen

var op: TopPicture; opb: TopBitmap;
 begin
   op:=TopPicture.create;
   op.loadFromFile(s);
 end;

Wie kann ich die Pixeldaten jetzt in die TopBitmap übertragen, um dann Scanline[] benützen zu können?
Denn ich möchte sie in einer TImage anzeigen. Wenn ich das über eine TLazIntfImage machen will, dann bräuchte ich dazu Schanline[], aber das gibt es ja nur in TopBitmap.

Werden denn die Pixeldaten nicht intern in einer Bitmap abgespeichert und verarbeitet?
Bei FreeImage war es zumindest so der Fall. Da brauchte ich dann nur die Pixeldaten
(FreeImage_GetBits: PByte) zeilenweise in die LazintfImage kopieren (GetLineStart()).
Geht das bei TopBitmap nicht?

Und kann diese beiden Aufrufe so gebrauchen? (Ich konnte es noch nicht ausprobieren).

Code: Alles auswählen

procedure Resample(op:TOpBitmap; w,h:integer); // NeuSkalieren
   begin
      if w < op.Data.Width then
         Stretch(w, h, sfHermite, DefaultFilterRadius[sfHermite], op) else
         Stretch(w, h, sfMitchell, DefaultFilterRadius[sfMitchell], op);
   end;
 
function CopyRect(R:TRect; Src: TopBitmap):TopBitmap; // UnterBitmap
    var lg,bypp,bpp,w,h:integer;  i,j:integer;
        pRes,pSrc:PByte;
  begin
    result:=TopBitmap.create;  bpp:=Src.BPP; bypp:=bpp div 8;
    with R do begin w:= right-left+1; h:=top-bottom+1; end;
    with result do
      begin
        width:=w; height:=h;
        Pixelformat:=Src.Pixelformat;
        Data.Height:=h; Data.Width:=w; // Data.UpdateSize geschieht automatisch
      end;
 
  // kopiere Pixels
    pRes:=result.ScanLine[R.Top]; inc(pRes, bypp*R.Left);
    lg:=bypp*w; // lg := result.Data.linelength
    pSrc:=Src.ScanLine[0];
    for i:=0 to h-1 do    // ginge mit Assembler wohl noch schneller
       begin move(pSrc^, pRes^, lg);
             inc(pSrc, Src.Data.LineLength);
             inc(pRes, lg);
       end;
  end;

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

Re: Probleme bei der Einbindung von OPBitmap

Beitrag von theo »

Ich kapiere nicht was du da machst.
OPBitmapForLaz ist die Package Datei. Die solltest du nicht so einbinden.
Erstelle die Abhängigkeit im Projektinspektor.
Dann nimm in die uses auf z.B. opbitmap, opbitmapformats, lazbridge wie in den Beispielen.

Ansonste benutze doch code-insight und die Beispiele.
Das Bitmap ist doch ein Property des Picture:

var Opp:TOPPicture;

Opp.Bitmap.Canvas...

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Probleme bei der Einbindung von OPBitmap

Beitrag von br_klaus »

Hallo, Theo!
Was bedeutet code-insight? (Mit Ctrl + Click zum gerade aktuellen Element/Prozedur in der entsprechenden Unit? Das funktioniert jedoch nur, wenn der Code in sich stimmig ist. Sobald ich etwas ausprobieren will und dann einen Fehler mache, muß ich erst den Fehler beheben, dann erst kann ich wieder mit Click zur Deklaration springen).

Und welches sind die Beispiele? die verschiedenen Demos? Aber da tritt überall die gleiche (obige) Fehlermeldung auf bei LazOpGIF.
(Und die ClxDemo scheint eher etwas für Delphi zu sein. Zumindest gibt es da keine .lpr, sondern nur eine .dpr-Datei).
Ich habe die OpBitmap Version 1.7. Gibt es schon eine neuere (für Windows Vista 32 Bits)?

Schon beim Versuch, das Package zu kompilieren. bekam ich bereits obige Fehlermeldung bei LazOpGIF.pas.
Und auch bei meinem Programm, sobald ich LazOpGIF (obwohl ich das gar nicht brauche) in die Uses-Liste mit einbinde. Also muß es wohl an dieser Datei liegen.

Das andere Problem habe ich gelöst mittels TLazOpPicture und AssignOpBitmapToBitmap (bekam diesen Hinweis beim Durchstöbern der Beiträge zu OpBitmap)
Vielleicht mache ich es noch immer zu kompliziert. (Wenn du willst, soll ich Dir meinen Code, sobald ich fertig bin, hochladen?)

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

Re: Probleme bei der Einbindung von OPBitmap

Beitrag von theo »

Die letzte Version ist diese:
http://www.theo.ch/lazarus/opbitmap64.zip

Geht auch für 32 bit.

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Probleme bei der Einbindung von OPBitmap

Beitrag von br_klaus »

Hallo, Theo

nach einigen Problemen mit neuer Lazarus-FPC-Installation (ein schwerer Bug in den neuesten SnapShots) läuft es jetzt wieder (fast) normal.
Kann auch OpBitmap normal gebrauchen (Version 64 für Win32). Bei Version 1.7 besteht weiterhin das Problem bei den GIFDateien, es wird wohl an dieser Version liegen.

Eine kleine Frage: wozu dient denn die Demo LCLIntegration-Demo? Daß man sehen kann, wie elend langsam Bitmap.pitcuree.loadFromFile ist? Deine LadeFunktion geht da um einiges schneller.
Auch würde ich keine TOpenPictureDialog nehmen, der zeigt immer erst das zu ladende Bild an (oder kann man dieses Feature auch abstellen?), und das kann bei gro0en Dateien sehr lange dauern. Und dann müssen sie ja eh noch einzweites Mal in die TImage geladen werden.
Außerdem ist da en kleiner Fehler bei den Uses-Angaben: TButton gibt es nicht in Buttons, sondern in StdCtrls (der Compiler nämlich die Komponente "TButton" nicht finden).

Und wozu dient denn die dx-Demo (und wie startet man die)?

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

Re: Probleme bei der Einbindung von OPBitmap

Beitrag von theo »

Die LCLIntegration Demo zeigt, dass man die Formatleser/schreiber in Lazarus auch gebrauchen kann, ohne dass man explizit ein TOPBitmap erstellt.

dx-Demo sagt mir nichts. Meinst clxdemo? Das ist eine Demo für Borland Kylix/Delphi, nicht für Lazarus.

Antworten