Windows GDI und WinAPI
-
- 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
Für GTK dürfte wohl hier der Hebel sein, ich muß nochmal zusätzliche Docus runterladen:
GdkDrawable
typedef struct _GdkDrawable GdkDrawable;
An opaque structure representing an object that can be drawn onto. This can be a GdkPixmap, a GdkBitmap, or a GdkWindow.
Die Qt-Doku solltet ihr eigentlich bei Linux dabei haben. wenn nicht gibt es die bei:
http://www.trolltech.com/developer/downloads/qt/x11" onclick="window.open(this.href);return false;
Das ist das volle Open-Source für X11 mit Doku.
GdkDrawable
typedef struct _GdkDrawable GdkDrawable;
An opaque structure representing an object that can be drawn onto. This can be a GdkPixmap, a GdkBitmap, or a GdkWindow.
Die Qt-Doku solltet ihr eigentlich bei Linux dabei haben. wenn nicht gibt es die bei:
http://www.trolltech.com/developer/downloads/qt/x11" onclick="window.open(this.href);return false;
Das ist das volle Open-Source für X11 mit Doku.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.
(Ringelnatz)
(Ringelnatz)
Ach so! Auf die harte Tour? 
Ja, das wird schon gehen.
Aber bevor du das Rad neu erfindest.
Schau dich mal in lclintfh.inc um
function GetRawImageFromBitmap
function CreateBitmapFromRawImage
sind eventuell heisse Kandidaten für dein Vorhaben.
Da kommst du über
in GraphType an den Pointer ran (Data: PByte)

Ja, das wird schon gehen.
Aber bevor du das Rad neu erfindest.
Schau dich mal in lclintfh.inc um
function GetRawImageFromBitmap
function CreateBitmapFromRawImage
sind eventuell heisse Kandidaten für dein Vorhaben.
Da kommst du über
Code: Alles auswählen
TRawImage = record
Description: TRawImageDescription;
Data: PByte;
DataSize: PtrUInt;
Mask: PByte;
MaskSize: PtrUInt;
Palette: PByte;
PaletteSize: PtrUInt;
end;
-
- 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
Na eben, nur so tief hab ich mich in die Untiefen der Lib's noch nicht vorgewagt. Aber damit sollte das möglich sein, sowas einfach als Extras zu bauen anstatt das bei jedem Aufruf von ScanLine völlig zu ändern.
Bei der Qt gab es sogar so eine Funktion, die fast ähnlich wie ScanLine aufgerufen werden konnte. Hatte ich mal für ein eigenes Objekt für die CLX bei Delphi gemacht.
Ist zwar etwas aufwendig aber dafür dann auch blitzschnell.
Bei der Qt gab es sogar so eine Funktion, die fast ähnlich wie ScanLine aufgerufen werden konnte. Hatte ich mal für ein eigenes Objekt für die CLX bei Delphi gemacht.
Ist zwar etwas aufwendig aber dafür dann auch blitzschnell.
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
Den hatte ich letztens als dayli-snapshot. Leider lief da so einiges nicht richtig, hatte reichlich Macken. Teilweise hat der sogar die interfaces von Prozeduren nicht richtig erkannt obwohl lediglich die Zeilenschaltung woanders war.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.
(Ringelnatz)
(Ringelnatz)
Hab kurz einen Machbarkeitstest gemacht.
Müsste klappen!
Achtung: Der Test ist ohne Rücksicht auf Verluste!
Müsste klappen!
Achtung: Der Test ist ohne Rücksicht auf Verluste!

Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var RawI:TRawImage;
bmph, mbmph:HBitmap;
po:Pointer;
i:integer;
begin
Image1.Picture.Bitmap.LoadFromFile('/home/theo/laztest.bmp');
Image1.Picture.Bitmap.PixelFormat:=pf32bit;
WidgetSet.GetRawImageFromBitmap(Image1.Picture.Bitmap.Handle,Image1.Picture.Bitmap.MaskHandle,Rect(0,0,200,200), RawI);
Po:=RawI.Data;
for i:=0 to 3000 do
begin
Cardinal(Po^):=$00FF0000;
inc(Po,4);
end;
WidgetSet.CreateBitmapFromRawImage(RawI, bmph, mbmph ,True);
Image2.Picture.Bitmap.Handle:=bmph;
Image2.Picture.Bitmap.MaskHandle:=mbmph;
end;
-
- 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
Frag Christian mal ob er schon nen sourceforge-account für die Utilitys eingerichtet hat. Dann könnten wir GraphicsMisc da gleich mit draufsetzen und das Beispiel gleich da einbauen.
Damit ich nun nicht gleich wieder mißverstanden werde, geht nicht darum das man das eventuell bei glscene schon hat. Ist mehr für die vereinfachte Übertragung von Delphi-Windoofs-Zeugs auf FPC/Lazarus ohne gleich den Vorschlaghammer zu benutzen.
Ich hätte da noch ne StreamMisc, mit der man strukturierte Daten in einem Stream verarbeiten kann. Dazu wird vor jedes Datenfeld eine Header gesetzt der spezifiziert welches Datenfeld, welcher Datentyp und welche Datengröße da angewackelt kommt. Das entspricht in etwa der Vorgehensweise der DATEV, nur das man bei dem Ding auch Multimedia-Daten im Stream haben kann. Hat den Vorteil, das man nicht auf die Reihenfolge der Daten achten muß. Einfach Header rein und die Daten dahinter. Beim Auslesen kann man sich dann am Header orientieren. Müßte man sich nur noch nen mime-magic für einfallen lassen, damit man gleich am Anfang sieht obs da strukturiert kommt.
Damit ich nun nicht gleich wieder mißverstanden werde, geht nicht darum das man das eventuell bei glscene schon hat. Ist mehr für die vereinfachte Übertragung von Delphi-Windoofs-Zeugs auf FPC/Lazarus ohne gleich den Vorschlaghammer zu benutzen.
Ich hätte da noch ne StreamMisc, mit der man strukturierte Daten in einem Stream verarbeiten kann. Dazu wird vor jedes Datenfeld eine Header gesetzt der spezifiziert welches Datenfeld, welcher Datentyp und welche Datengröße da angewackelt kommt. Das entspricht in etwa der Vorgehensweise der DATEV, nur das man bei dem Ding auch Multimedia-Daten im Stream haben kann. Hat den Vorteil, das man nicht auf die Reihenfolge der Daten achten muß. Einfach Header rein und die Daten dahinter. Beim Auslesen kann man sich dann am Header orientieren. Müßte man sich nur noch nen mime-magic für einfallen lassen, damit man gleich am Anfang sieht obs da strukturiert kommt.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.
(Ringelnatz)
(Ringelnatz)
Wieso ich? Sprecht ihr nicht mehr miteinander?schnullerbacke hat geschrieben:Frag Christian mal ob er schon nen sourceforge-account für die Utilitys eingerichtet hat.

Wart's mal ab. Das "Cowboy"-Beispiel oben hab ich in 10 Minuten zusammengehackt und bei mir funzte es mit 32bit Bitmap auf GTK. Danach musste ich kurz weg.schnullerbacke hat geschrieben: Dann könnten wir GraphicsMisc da gleich mit draufsetzen und das Beispiel gleich da einbauen.
Hast du das mal auf Windows gecheckt? Ich werde gleich noch schauen, wie es sich mit anderen Pixelformaten verhält und ob man die eigentliche Scanline da rauskriegt.
Könnte z.B. Probleme mit den Boundaries geben.
Da stimme ich dir zu.schnullerbacke hat geschrieben: Damit ich nun nicht gleich wieder mißverstanden werde, geht nicht darum das man das eventuell bei glscene schon hat. Ist mehr für die vereinfachte Übertragung von Delphi-Windoofs-Zeugs auf FPC/Lazarus ohne gleich den Vorschlaghammer zu benutzen.
-
- 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:
Ich hab keinen account gemacht, da ich es für sinviller erachte das minta einen svn server auf dem forumsrechner aufsetzt was sollte man denn bitte in den sf acc reinschreiben ? is ja alles projektorientiert ausserdem villeicht teilweise etwas zu öffentlich für unsere spielereien
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/
-
- 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
Na ja, das eine oder andere dürfte für's Projekt durchaus interessant werden. Aber ein svn hier würds auch erstmal tun. Ralli kann dann in den Fundus greifen und daraus gleich was für sein Tut nutzen. Ein Beispiel sagt meist mehr als 1000 Worte.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.
(Ringelnatz)
(Ringelnatz)
Hab's probiert mit dem TRawImage, aber ich komme damit nicht zu Potte.
Das Problem liegt nicht mal an den damit verbundenen Funktionen, sondern daran, dass das Lazarus Bitmap (mindestens unter GTK) einfach nicht wie ein Delphi Bitmap funktioniert.
Kann jemand folgende Beobachtung bestätigen:
Also so kann man schon mal kein 24bit Bitmap erzeugen, was die meisten Delphi Codes welche Scanline benutzen erwarten.
Es sei denn, man hat zufällig die Grafik auf 24 Bit eingestellt.
Das Problem liegt nicht mal an den damit verbundenen Funktionen, sondern daran, dass das Lazarus Bitmap (mindestens unter GTK) einfach nicht wie ein Delphi Bitmap funktioniert.
Kann jemand folgende Beobachtung bestätigen:
Code: Alles auswählen
Image1.Picture.Bitmap.LoadFromFile('/home/theo/SI-calendar-2006.bmp');
//lädt z.B. ein 8 bit Bitmap
writeln(Ord(Image1.Picture.Bitmap.PixelFormat));
//gibt immer 0 also pfDevice obwohl das geladene Bitmap 8bit hat
writeln(Image1.Picture.Bitmap.Width,' ',Image1.Picture.Bitmap.Height);
//Stimmt
Image1.Picture.Bitmap.PixelFormat:=pf24bit;
writeln(Ord(Image1.Picture.Bitmap.PixelFormat));
//Angabe 6 Stimmt
writeln(Image1.Picture.Bitmap.Width,' ',Image1.Picture.Bitmap.Height);
//w und h sind 0, das Bitmap hat intern immer noch pfDevice
Es sei denn, man hat zufällig die Grafik auf 24 Bit eingestellt.
-
- 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
Das würde dann aber bedeuten, das GTK das Pixelformat bei LoadFromFile anpassen muß und dabei ne andere Palette verwendet. Bei mir läuft SuSE mit 24 bit, das läßt sich aber ändern. Das probier ich dann morgen mal, wie sich das bei unterschiedlichen Einstellungen verhält.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.
(Ringelnatz)
(Ringelnatz)
Es scheint so.schnullerbacke hat geschrieben:Das würde dann aber bedeuten, das GTK das Pixelformat bei LoadFromFile anpassen muß und dabei ne andere Palette verwendet. Bei mir läuft SuSE mit 24 bit, das läßt sich aber ändern.
Palette ist nicht das richtige Wort, die gibt's erst ab 8bit abwärts.
Aber BitsPerPixel.
Vielleicht schmeisse ich heute noch einen Teil des immer noch unfertigen und eingeschlafenen OPBitmap aufs Web.
Zum Testen für dich und alle die's interessiert. Aber mal noch ohne die Dateiformate.
Nur zum zeigen wie man doch mit 24Bit Scanline arbeiten kann.
Bin grad dabei eine Demo für unser Problem zu schreiben, welche die erwähnten Funktionen verwendet und dabei das Bild von und nach Lazarus Bitmap liest/schreibt:
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var RawI:TRawImage;
bmph, mbmph:HBitmap;
Op:TOpbitmap;
w,h,x,y:integer;
begin
Image1.Picture.Bitmap.LoadFromFile('/home/theo/laztest.bmp');
w:=Image1.Picture.Bitmap.Width;
h:=Image1.Picture.Bitmap.Height;
With Image1.Picture.Bitmap do
WidgetSet.GetRawImageFromBitmap(Handle,MaskHandle,Rect(0,0,w,h), RawI);
Op:=TOpbitmap.Create;
Op.PixelFormat:=PixelFormatFromBPP(RawI.Description.BitsPerPixel);
Op.Width:=w;
Op.Height:=h;
Move(RawI.Data^,OP.ScanLine[0]^,w*h*Op.BPP div 8);
//So ab hier geht der Spass Los: OpBitmap kann nun wie ein 24bit Bitmap Behandelt werden:
Op.PixelFormat:=pf24bit;
For y:=0 to h-1 do
For x:=0 to w-1 do
PRGBTriple(Op.ScanLine[Y])[X].rgbtBlue:=0; //Einfach mal Blau auf 0 setzen für das ganze Bitmap
//Spass Ende: OPBitmap Pixelformat auf device zurücksezten:
Op.PixelFormat:=PixelFormatFromBPP(RawI.Description.BitsPerPixel);
RawI.Data:=op.ScanLine[0];
WidgetSet.CreateBitmapFromRawImage(RawI, bmph, mbmph ,True);
Image1.Picture.Bitmap.FreeImage;
Image1.Picture.Bitmap.Handle:=bmph;
Image1.Picture.Bitmap.MaskHandle:=mbmph;
Op.free;
end;