Operacje na bitmapach w WinAPI - GetDIBits

0

Dawno nic nie pisałem to teraz się zrewanżuję :) bo będzie trochę długie. Ok więc lecąc od góry mam taki rekord:

type
TBitmapka = record
Info: TBitmap;
Data: hBITMAP;
DC: hDC;
BitmapFileHeader: TBITMAPFILEHEADER;
BitmapInfoHeader: TBITMAPINFOHEADER;
BitmapInfo: PBitMapInfo;
BitmapBits: Pointer;
end;

To tak żeby było wiadomo co jest co. Do wczytania bitmapy używam kodu (dopasownageo do moich potrzeb) od przyjaciół z prawej tzn rosjan.

procedure LoadBitmap24bit(var Bmp: TBitmapka; DC: hDC; Plik: String);
var
F : File;
ReadCount : DWORD;
begin
AssignFile(F, Plik);
Reset(F, 1);
BlockRead(F, Bmp.BitmapFileHeader, SizeOf(TBitmapFileHeader), ReadCount);
if (ReadCount SizeOf(TBitmapFileHeader)) then
begin
MessageBox(0, 'Krzak w BITMAPFILEHEADER', 'DIB From File Sample', MB_OK+MB_ICONERROR);
CloseFile(F);
Exit;
end;
BlockRead(F, Bmp.BitmapInfoHeader, SizeOf(TBitmapInfoHeader), ReadCount);
if (ReadCount SizeOf(TBitmapInfoHeader)) then
begin
MessageBox(0, 'Krzak w TBITMAPINFOHEADER', 'DIB From File Sample', MB_OK+MB_ICONERROR);
CloseFile(F);
Exit;
end;
GetMem(Bmp.BitmapBits, Bmp.BitmapInfoHeader.biSizeImage);
BlockRead(F, Bmp.BitmapBits^, Bmp.BitmapInfoHeader.biSizeImage, ReadCount);
if (ReadCount Bmp.BitmapInfoHeader.biSizeImage) then
begin
MessageBox(0, 'Krzak w danych', 'DIB From File Sample', MB_OK+MB_ICONERROR);
CloseFile(F);
Exit;
end;

Bmp.BitmapInfo.bmiHeader:=Bmp.BitmapInfoHeader;
Bmp.Data:=CreateDIBitmap(DC, Bmp.BitmapInfoHeader, CBM_INIT, Bmp.BitmapBits, Bmp.BitmapInfo^, DIB_RGB_COLORS);

if Bmp.Data=0 then MessageBox(0, 'Krzak w create', 'DIB From File Sample', MB_OK+MB_ICONERROR);
CloseFile(F);
end;

Bitmapa jest wczytywana dobrze, bo BitBlt ją rysuje, problem polega na tym że program się wyłącza (a gdy jest w sesji debug to wyskakuje CPU View) gdy próbuję wykonac operację na pixelach pobranych przez GetDIBits w tym kawałku kodu:

var
S,D,R: array of Cardinal;
begin
SetLength(S,400);
SetLength(D,400);
SetLength(R,400);
for n:=0 to W-1 do
begin
GetDIBits(Src.DC,Src.Data,n,1,@S,Src.BitmapInfo^,DIB_RGB_COLORS);
GetDIBits(Dst.DC,Dst.Data,n,1,@D,Dst.BitmapInfo^,DIB_RGB_COLORS);
for i:=0 to High(R) do
begin
R[i]:=Blend(S[i],D[i]);
end;
SetDIBits(Dst.DC,Dst.Data,n,1,@R,Dst.BitmapInfo^,DIB_RGB_COLORS);
end;

Jakieś sugestie? Ja teraz szukam błędów, ale może ktoś z Was szybciej znajdzie...

0

Bitmapa jest wczytywana dobrze, bo BitBlt ją rysuje, problem polega na tym że program się wyłącza (a gdy jest w sesji debug to wyskakuje CPU View) gdy próbuję wykonac operację na pixelach pobranych przez GetDIBits w tym kawałku kodu:

S,D,R: array of Cardinal; // Dlaczego array of Cardinal? Nie powinno być array of RGBQuad lub PWordArray?

SetLength(S,400); // Dlaczego 400? A co jeżeli większa jest szerokość bitmapy?

0

S,D,R: array of Cardinal; // Dlaczego array of Cardinal? Nie powinno być array of RGBQuad lub PWordArray?

SetLength(S,400); // Dlaczego 400? A co jeżeli większa jest szerokość bitmapy?

400 bo bitmapa ma 400, to kod testowy na razie ;) a z tym RGBQuad to pewnie racja zaraz zobaczę w helpie nie piszą jakiego typu to ma być struktura a kolor jest typu Cardinal :P

[b]Dopisane: [/b] RGBQuad nie pomaga program sypie się na funkcji GetDIBits, pewnie źle jej używam a nigdzie nie mogę znaleźć sensownego helpa :/

1 użytkowników online, w tym zalogowanych: 0, gości: 1