fill buffer iz c++ funkcije

Vse o grafiki, canvasu, directdraw, itd.
Odgovori
atmars
Prispevkov: 35
Pridružen: 27.05.2002 08:57:41

fill buffer iz c++ funkcije

Odgovor Napisal/-a atmars » 18.09.2008 17:25:46

Imam neko funkcijo iz DLL, ki ima parameter definiran kot

Koda: Izberi vse

  Returnimage( unsigned char *buf )
predvidevam da je v delphiju, ko pisem funkcij to

Koda: Izberi vse

  Returnimage( var buf : PByte ) 
Funkcija zapolni buf s sliko 24 bpp.
A se keremu kaj sanja kako bi v delphiju dobil ven iz tega tbimpap :)

Velikost buf poznam, oziroma imam kalkulacijo kako jo izracunati.

aoven
Prispevkov: 2338
Pridružen: 27.06.2001 23:56:07

fill buffer iz c++ funkcije

Odgovor Napisal/-a aoven » 18.09.2008 21:43:34

Returnimage( var buf : PByte )
Nope. Bodisi brez var bodisi Byte namesto PByte. Torej:

Koda: Izberi vse

ReturnImage(var Buf: Byte);
ali

Koda: Izberi vse

ReturnImage(Buf: PByte);
A se keremu kaj sanja kako bi v delphiju dobil ven iz tega tbimpap
Nekako takole:

Koda: Izberi vse

var
  MS: TMemoryStream;
  B: TBitmap;
begin
  B := TBitmap.Create();
  try
    MS := TMemoryStream.Create();
    try
      MS.Size := GetImageSize(); // Here comes the actual image size calculation.
      ReturnImage(PByte(MS.Memory)); // Declaration assumed to be: ReturnImage(Buf: PByte);
      B.LoadFromStream(MS);
    finally
      MS.Free();
    end;

    // Do something with B here...
  finally
    B.Free();
  end;
Aleksander

aoven
Prispevkov: 2338
Pridružen: 27.06.2001 23:56:07

fill buffer iz c++ funkcije

Odgovor Napisal/-a aoven » 18.09.2008 22:03:06

Pa v Delphiju ne pozabit na stdcall direktivo, če jo C++ deklaracija zahteva.

Aleksander

atmars
Prispevkov: 35
Pridružen: 27.05.2002 08:57:41

fill buffer iz c++ funkcije

Odgovor Napisal/-a atmars » 26.09.2008 17:20:38

Hvala
Nakar izvem da mi funkcija vrne RAW pixle namesto kaksnega pametnega formata.

V c je funkcija da dobim HBITMAP

Koda: Izberi vse

 

  HBITMAP CreateBitmapFromBuffer(const BYTE *buf, int w, int h, int bpp)
	HDC hdc;
	BITMAPINFO bi;
	HBITMAP hBmp;

	memset(&bi, 0, sizeof(bi));
	bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
	bi.bmiHeader.biWidth = w;
	bi.bmiHeader.biHeight = h;
	bi.bmiHeader.biBitCount = bpp;
	bi.bmiHeader.biSizeImage = w * h * bpp / 8;
	bi.bmiHeader.biPlanes = 1;
	hdc = GetDC(0);
	hBmp = CreateDIBitmap(hdc, &bi.bmiHeader, CBM_INIT, buf, &bi, 0);
	ReleaseDC(0, hdc);
  DeleteDC(DC_Handle);

 
Jaz sem poiskusal po tem vzoru dobiti ven sliko, pa ne rata. Skoraj zagotovo, ker nepravilno uporabim Pointerje in Mem. Tole je moja koda

Koda: Izberi vse

  hBmp: HBITMAP;
  BitmapInfo: PBitmapInfo;
  DC : HDC;
  BitsMem: Pointer;
begin
  stbyte := 3 * 1 * 128 * 72;


  B := TBitmap.Create();
  b.PixelFormat := pf24bit;
  b.Width := 128;
  b.Height := 72;

  try
    MS := TMemoryStream.Create();


    try
      MS.Size := stbyte;
      RetunImage(Pchar('temp.sfr'),  PByte(MS.Memory) , 1, 128, 72, 1);

     GetMem(BitmapInfo, sizeof(BitmapInfo));

     with BitmapInfo^.bmiHeader do
         begin
         biWidth := 128;
         biHeight := 72;
         biBitCount := 24;
         biSizeImage := Round (128 * 70 * 24 / 8 );
         biPlanes := 1;
     end;


    GetMem(BitsMem, stbyte);
    MS.ReadBuffer(BitsMem^, stbyte);

    DC := GetDC(0);
    hBmp := CreateDIBitmap(DC, BitmapInfo^.bmiHeader, CBM_INIT, BitsMem, BitmapInfo^, DIB_RGB_Colors);
    ReleaseDC(0, DC);
    DeleteDC(0);


    b.Handle := hbmp;
    b.SaveToFile('temp.bmp');

    ReleaseDC(0, DC);
 // FreeMem(BitmapInfo, sizeof(BitmapInfo));

    finally
      MS.Free();
    end;

  finally
    B.Free();
  end;
 
Koncni rezultat je temp.bmp z 0 bytov :roll:

Sem iskal po netu ce je kje kaksna smernica, pa nic kaj posebnega.
Kaksna ideja?

Odgovori