
Опытный
 
Профиль
Группа: Участник
Сообщений: 279
Регистрация: 10.7.2006
Репутация: нет Всего: 4
|
приветик всем. есть два bitmap один создается из окна (24 bit), второй - 8 bit из файла. работа только через винапи. цель составить 32 bit. буду рад помощи. без лишних слов привожу код: | Код | interface
type Data = record SIZE:DWord; BIH:^BITMAPINFO; DC:HDC; HANDLE:HBITMAP; end;
function joinBitmaps(WND:HWND; pszFilename:PCHAR ):HBITMAP; function getBitmapColorTableFromFile (pszFilename:PCHAR; bits: PSCR):Data; function getBitmapColorTableFromWindow(WND:HWND):Data;
implementation function getBitmapColorTableFromFile;
var F : FILE; BFH : BITMAPFILEHEADER; COLOR_TABLE_SIZE: DWORD; i:integer; begin
assignfile(f,pszFilename); reset(F,1); blockread(f, BFH, SizeOf(BFH)); GetMem(RESULT.BIH, BFH.bfOffBits - 14); blockread(f,RESULT.BIH^, {filesize(f) - 14 - COLOR_TABLE_SIZE} BFH.bfOffBits - 14 ); COLOR_TABLE_SIZE := RESULT.BIH^.bmiHeader.biWidth * RESULT.BIH^.bmiHeader.biHeight * RESULT.BIH^.bmiHeader.biBitCount shr 3;
GetMem(bits, COLOR_TABLE_SIZE); blockread(f, bits^, COLOR_TABLE_SIZE, i); closefile(f);
RESULT.DC := GetDC(0); RESULT.HANDLE := CreateCompatibleBitmap(RESULT.DC , RESULT.BIH^.bmiHeader.biWidth, RESULT.BIH^.bmiHeader.biHeight); RESULT.DC := CreateCompatibleDC(RESULT.DC );
SetDiBits(RESULT.DC, RESULT.HANDLE, 0, RESULT.BIH^.bmiHeader.biHeight, bits, RESULT.BIH^, DIB_RGB_COLORS); SelectObject(RESULT.DC, RESULT.HANDLE);
RESULT.SIZE := COLOR_TABLE_SIZE;
// àëüòåðíàòèâà // RESULT.HANDLE:=loadimage(0,pszfilename,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); end;
function getBitmapColorTableFromWindow; var
WND_RECT:TRECT; hBmp : hBitmap; DeskDC : hDC; DC : hDC; BFH : BITMAPFILEHEADER; BIH : tagBITMAPINFO; ScrX, ScrY : Integer; ScrSize : Cardinal; Bits : PScr; RETURN_DATA: Data; begin Windows.GetWindowRect(WND,WND_RECT); SCRX := (WND_RECT.Right - WND_RECT.Left); SCRY := (WND_RECT.Bottom - WND_RECT.Top); ScrSize := ScrX * ScrY * 3; GetMem(Bits, ScrSize); DeskDC := GetDC(WND); hBmp := CreateCompatibleBitmap(DeskDC, ScrX, ScrY); DC := CreateCompatibleDC(DeskDC);
SelectObject(DC, hbmp); BitBlt(DC, 0, 0, SCRX, SCRY, DeskDC, 0, 0, SrcCopy);
with BFH do begin bfType := $4D42; bfSize := SCRX * SCRY * 3 + SizeOf(BFH) + SizeOf(BIH); bfReserved1 := 0; bfReserved2 := 0; bfOffBits := SizeOf(BFH) + SizeOf(BIH); end;
with BIH.bmiHeader do
begin biSize := sizeof(BIH); biWidth := SCRX; biHeight := SCRY; biPlanes := 1; biBitCount := 24; biCompression := BI_RGB; biSizeImage := ScrSize; biClrImportant := 0; end;
GetDiBits(DC, hbmp, 0, SCRY, Bits, BIH, DIB_RGB_COLORS); // DeleteObject(hbmp);
GetMEM(RETURN_DATA.BIH, SizeOf(BIH)); RETURN_DATA.BIH^:=BIH; RETURN_DATA.SIZE := ScrSize; RETURN_DATA.DC:=DC; RETURN_DATA.HANDLE:=hbmp; RESULT:=RETURN_DATA; end;
function createBitmap32(W, H:WORD):DATA; var ScrSize:Cardinal; begin ScrSize := W * H * 4;
GETMEM(RESULT.BIH, sizeOf(tagBITMAPINFO));
with RESULT.BIH^.bmiHeader do
begin biSize := sizeof(tagBITMAPINFO); biWidth := W; biHeight := H; biPlanes := 1; biBitCount := 32; biCompression := BI_RGB; biSizeImage := ScrSize; biClrImportant := 0; end; RESULT.DC := GetDC(0); RESULT.HANDLE := CreateCompatibleBitmap(RESULT.DC, W, H); RESULT.DC := CreateCompatibleDC(RESULT.DC);
SelectObject(RESULT.DC,RESULT.HANDLE);
end;
function joinBitmaps;
var // Bits8,Bits24,Bits32 : Pointer; Bits8,Bits24,Bits32 : PScr; xx, yy: Integer; SrcBase, MapBase, DstBase: Pointer;
SrcInc: Integer; // Ðàçìåðû ñòðîê ïèêñåëåé DST_DATA, MAP_DATA, SRC_DATA:DATA; //------------------
begin
// bits24:=nil; SRC_DATA:=getBitmapColorTableFromWindow(WND); GetMem(bits24, SRC_DATA.BIH^.bmiHeader.biSizeImage); GetDiBits(SRC_DATA.DC, SRC_DATA.HANDLE, 0, SRC_DATA.BIH^.bmiHeader.biHeight, bits24, SRC_DATA.BIH^, DIB_RGB_COLORS); // BitBlt(GETDC(0),0,0, SRC_DATA.BIH^.bmiHeader.biWidth, SRC_DATA.BIH^.bmiHeader.biHeight,SRC_DATA.DC,0,0,SRCCOPy);
bits8:=nil; MAP_DATA := getBitmapColorTableFromFile(pszfilename, bits8); GetMem(bits8, MAP_DATA.BIH^.bmiHeader.biSizeImage); GetDiBits(MAP_DATA.DC, MAP_DATA.HANDLE, 0, MAP_DATA.BIH^.bmiHeader.biHeight, bits8, MAP_DATA.BIH^, DIB_RGB_COLORS); // BitBlt(GETDC(0),0,0, MAP_DATA.BIH^.bmiHeader.biWidth, MAP_DATA.BIH^.bmiHeader.biHeight,MAP_DATA.DC,0,0,SRCCOPy);
DST_DATA:=createBitmap32(MAP_DATA.BIH^.bmiHeader.biWidth, MAP_DATA.BIH^.bmiHeader.biHeight); GetMem(bits32, DST_DATA.BIH^.bmiHeader.biSizeImage);
SRCBASE := bits24; MAPBASE := bits8; DSTBASE := bits32;
SRCINC := SRC_DATA.BIH^.bmiHeader.biWidth * 3;
for yy := 0 to MAP_DATA.BIH^.bmiHeader.biHeight - 1 do begin
for xx := 0 to MAP_DATA.BIH^.bmiHeader.biWidth - 1 do begin // alert(inttostr(BYTE(MAPBASE^))); DWORD(DSTBASE^):=DWORD(SRCBASE^) { + BYTE(MAPBASE^) shl 4}; { alert(inttostr(BYTE (MAPBASE^))); alert(inttostr(DWORD(SRCBASE^))); alert(inttostr(DWORD(DSTBASE^))); alert('ok'); //} DWORD(MAPBASE) :=DWORD(MAPBASE) + 1; DWORD(SRCBASE) :=DWORD(SRCBASE) + 3; DWORD(DSTBASE) :=DWORD(DSTBASE) + 4;
if xx>=SRC_DATA.BIH^.bmiHeader.biWidth then begin DWORD(SRCBASE):=DWORD(bits24)+DWORD((yy+1)*SRCINC); break; end;
end; end; SetDiBits(MAP_DATA.DC, DST_DATA.HANDLE, 0, SRC_DATA.BIH^.bmiHeader.biHeight, Bits32, SRC_DATA.BIH^, DIB_RGB_COLORS); BitBlt(GETDC(0),0,300,DST_DATA.BIH^.bmiHeader.biWidth,DST_DATA.BIH^.bmiHeader.biHeight,DST_DATA.DC,0,0,SRCCOPy); result:=0; end;
|
Добавлено через 1 минуту и 26 секундинтересует 213я сторочка
|