Autor Beitrag
moddin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75

WinXP Pro
Delphi 7 Enterprise ;-)
BeitragVerfasst: Mi 17.01.07 00:02 
weiß jemand wie ich zb über das Handle eines zb TBitmapImage zugriff auf den Speicher bzw auf den MemoryStream bekomme
der code in graphics.pas verwirrt mich

_________________
Willst du Körper an Körper pressen? Atem spüren? Gerüche wahrnehmen? Verschiedene Stellungen probieren? Rein und raus? Von hinten nach vorne? Ja? Dann nimm den Bus!


Zuletzt bearbeitet von moddin am Fr 19.01.07 15:25, insgesamt 1-mal bearbeitet
moddin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75

WinXP Pro
Delphi 7 Enterprise ;-)
BeitragVerfasst: Mi 17.01.07 22:25 
Titel: lol
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function GetBitmapMem(bmpHandle : THandle) : TBitmap;
var
  bmp : PBitmapInfoHeader;
  hdr : TBitmapFileHeader;
  s : TMemoryStream;
begin
  Result := TBitmap.Create;
  bmp := PBitmapInfoHeader (GlobalLock(bmpHandle));
  FillChar (hdr, SizeOf (hdr), 0);
  hdr.bfType := $4D42;
  s := TMemoryStream.Create;
  s.Write (hdr, SizeOf (hdr));
  s.Write (bmp^,GlobalSize(bmpHandle));
  Result.LoadFromStream(s);
  GlobalUnlock(bmpHandle);
  s.Free
end;


bitte schön ^^

_________________
Willst du Körper an Körper pressen? Atem spüren? Gerüche wahrnehmen? Verschiedene Stellungen probieren? Rein und raus? Von hinten nach vorne? Ja? Dann nimm den Bus!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 18.01.07 08:30 
Titel: Re: lol
user profile iconmoddin hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
function GetBitmapMem(bmpHandle : THandle) : TBitmap;
var
  bmp : PBitmapInfoHeader;
  hdr : TBitmapFileHeader;
  s : TMemoryStream;
begin
  Result := TBitmap.Create;
  bmp := PBitmapInfoHeader (GlobalLock(bmpHandle));
  try
    FillChar (hdr, SizeOf (hdr), 0);
    hdr.bfType := $4D42; //<--
    s := TMemoryStream.Create;
    try
      s.Write (hdr, SizeOf (hdr));
      s.Write (bmp^,GlobalSize(bmpHandle));
      Result.LoadFromStream(s);
    finally
      s.Free;
    end;
  finally
    GlobalUnlock(bmpHandle);
  end;
end;


bitte schön ^^


Mal ne kleine Frage zu der markierten Zeile: Musste man nich zusätzlich noch die größen des Bitmap mit eintragen???

Ach ja: Die hervorgehobenen Zeilen sollten Unbedingt mit aufgenommen werden, da ihr sonst bei einem Speicherfehler, das Bitmap-Handle nicht entsperrt oder Speucher nicht freigebt.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
moddin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75

WinXP Pro
Delphi 7 Enterprise ;-)
BeitragVerfasst: Fr 19.01.07 15:23 
hab nochmal nen bissel rumgestöbert und nachgelsen und bin dann auf das hier gekommen

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function GetBitmapMem(hBmp:hBitmap;var fSize:Cardinal):pointer;
var Dib : TDIBSection;
    bfh : TBitmapFileHeader;
begin
 FillChar(bfh,SizeOf(bfh),0);
 FillChar(dib,SizeOf(dib),0);
 GetObject(hBmp, sizeof(dib), @dib);
 dib.dsBmih.biSizeImage := dib.dsBm.bmWidth*dib.dsBm.bmHeight*(dib.dsBm.bmBitsPixel div 8);
 bfh.bfOffBits := sizeof(bfh) + sizeof(dib.dsBmih);
 bfh.bfType := $4D42;
 bfh.bfSize := bfh.bfOffBits + dib.dsBmih.biSizeImage;
 fSize := bfh.bfSize;
 GetMem(Result,fSize);
 Move(Result,bfh, sizeof(bfh));
 Move(Pointer(Cardinal(Result) + sizeof(bfh))^,dib.dsBmih, sizeof(dib.dsBmih));
 Move(Pointer(Cardinal(Result) + bfh.bfOffBits)^, dib.dsBm.bmBits, dib.dsBmih.biSizeImage);
end;


erzeugt ein Bitmapobject direkt im speicher :-)
die andere funktion dürfte fehlerhaft ein da GlobalSize immer 0 zurückliefert

@BenBe : soweit ich weiß muss man nur $4d42 reinschrieben ( = 'BM' = 19778 )

_________________
Willst du Körper an Körper pressen? Atem spüren? Gerüche wahrnehmen? Verschiedene Stellungen probieren? Rein und raus? Von hinten nach vorne? Ja? Dann nimm den Bus!