type
RGB = packed record
r: byte;
g: byte;
b: byte;
end;
TBitsmap = array of RGB;
var
newBits : TBitsmap;
oldBits : TBitsmap;
...
function GetBits(bmWork: TBitmap; var Bits : TBitsmap): boolean;
var
bInfo : TBitmapInfo;
begin
FillChar (bInfo, SizeOf(bInfo), 0);
with bInfo.bmiHeader do
begin
biSize := SizeOf(bInfo);
biWidth := wWidth;
biHeight := -wHeight;
biPlanes := 1;
biBitCount := GetPixFormat(bmWork);
biCompression := BI_RGB;
end;
GetDIBits(bmWork.Canvas.Handle,bmWork.Handle,0,wHeight,nil,bInfo,
DIB_RGB_COLORS);
SetLength(Bits,bInfo.bmiHeader.biSizeImage);
Result := GetDIBits(bmWork.Canvas.Handle,bmWork.Handle,0,wHeight,Bits,bInfo,
DIB_RGB_COLORS) > 0;
end;
GetDiBits, где ошибка?
Вот код:
Код:
вот так вызываю
Код:
if not GetBits(bmNew,newBits) then
raise Exception.Create('Can''t create bits array from new bitmap'+
#10#13+SysErrorMessage(GetLastError));
if not GetBits(bmOld,oldBits) then
raise Exception.Create('Can''t create bits array from old bitmap:'+
#10#13+SysErrorMessage(GetLastError));
raise Exception.Create('Can''t create bits array from new bitmap'+
#10#13+SysErrorMessage(GetLastError));
if not GetBits(bmOld,oldBits) then
raise Exception.Create('Can''t create bits array from old bitmap:'+
#10#13+SysErrorMessage(GetLastError));
Создание и заполнение первого массива newBits происходит нормально.
А второго массива создание происходит но, он не заполняется
GetDIBits(bmWork.Canvas.Handle,bmWork.Handle,0,wHeight,Bits,bInfo,
DIB_RGB_COLORS) = 0;
Причем не заполняется всегда второй, если их поменять местами (первым заполнять oldBits), то не заполняется newBits.
Подскажите, пожайлуста, в чем загвоздка.
Код:
FillChar (bInfo, SizeOf(bInfo), 0);
Размер bInfo может быть больше sizeof(binfo): если у битмапа есть палитра, то размер увеличивается на 4*(к-во цветов), иначе больше на 12 байт. Вполне возможно без палитры он биты вернуть не может корректно.