Get a device-free bitmap sector from GDI + Bitmap object

xiaoxiao2021-03-06  15

Handle Bitmaptodib (Bitmap * Pbitmap)

{

Word bibits;

BitmapInfoheader Bi;

BitmapInfoHeader Far * lpbi;

DWORD DWLEN;

Handle HDIB;

Handle H;

HDC HDC;

HPALETTE HPAL;

IF (! pbitmap)

Return NULL;

Pixelformat Format = Pbitmap-> getpixelformat ();

Switch (Format) {

Case pixelformat1bppindexed:

BIBITS = 1;

Break;

Case pixelformat4bppindexed:

BIBITS = 4;

Break;

Case pixelformat8bppindexed:

BIBITS = 8;

Break;

Case pixelformat24bpprgb:

BIBITS = 24;

Break;

Case pixelformat32bpprgb:

BIBITS = 32;

Break;

}

bi.bisize = sizeof (bitmapinfohead);

Bi.biwidth = pbitmap-> getWidth ();

Bi.biheight = pbitmap-> getHeight ();

Bi.Biplanes = 1;

Bi.BIBITCOUNT = BIBITS;

BI.BICOMPRESSION = 0;

Bi.bisizeImage = 0;

bi.bixpelspermeter = 0;

Bi.biypelspermeter = 0;

Bi.bi.biRused = 0;

Bi.Biclrimportant = 0;

// Get Palette Size

Uint size = pbitmap-> getpalettesize ();

ColorPalette * Palette = (colorpalette *) malloc (size);

Pbitmap-> getPalette (Palette, size);

// Get Data Size

Bitmapdata BMD;

Pbitmap-> Lockbits (New RECT (0, 0, Pbitmap-> getWidth (), Pbitmap-> getHeight ()),

ImagelockModeRead, Format, & BMD);

Bi.bisizeImage = bmd.height * bmd.stride;

DWLEN = bi.bisize paste-> count * sizeof (rgbquad) bi.bisizeImage

HDIB = GlobalAlloc (GHND, DWLEN);

LPBI = (BitmapInfoHeader Far *) GlobalLock (HDIB);

* lpbi = bi;

Memcpy (lpbi, & bi, bi.bisize);

Rgbquad * ppal = (rgbquad *) ((Byte *) lpbi bi.bisize);

// ppal = (logpaalette *) Localalloc (LPTR, SIZEOF (LogPalette) Palette-> Count * Sizeof (Paletteentry); if (size> 0)

{

// ppal-> PalNumentries = PALETTE-> COUNT;

// ppal-> paalversion = parth;

For (int i = 0; i count; i ) {

PPAL [i] .rgbred = getRvalue (Palette-> Entries [i]);

PPAL [i] .rgbgreen = getGvalue (Palette-> Entries [i]);

PPAL [i] .RGBBBLUE = getBValue (Palette-> Entries [i]);

PPAL [i] .rgbreserved = (byte) 0;

}

// hpal = creagette (ppal);

// localfree ((handle) ppal;

}

// pbyte pdata = (pbyte) (PPAL PALETTE-> Count * sizeof (rgbquad));

PBYTE PDATA = (Pbyte) LPBI BI.Bisize Palette-> Count * SizeOf (RGBQUAD);

PBYTE PSRC = (pbyte) bmd.scan0;

For (int R = bmd.height - 2; r> = 0; r -)

{

Memcpy (PDATA, PSRC R * BMD.Stride, BMD.stride);

PDATA = bmd.stride;

}

// Memcpy (pdata, bmd.scan0, bmd.height * bmd.stride);

Bi = * lpbi;

GlobalUnlock (HDIB);

Pbitmap-> UNLOCKBITS (& BMD);

Return HDIB;

}

转载请注明原文地址:https://www.9cbs.com/read-48907.html

New Post(0)