![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
GetDiBits, где ошибка? [D6, WinXP]
Магедон © (2006-10-10 19:54:00)Доброе время суток.
Вот код:
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;
вот так вызываю
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));
Создание и заполнение первого массива newBits происходит нормально.
А второго массива создание происходит но, он не заполняется
GetDIBits(bmWork.Canvas.Handle,bmWork.Handle,0,wHeight,Bits,bInfo,
DIB_RGB_COLORS) = 0;
Причем не заполняется всегда второй, если их поменять местами (первым заполнять oldBits), то не заполняется newBits.
Подскажите, пожайлуста, в чем загвоздка.
Sapersky (2006-10-11 13:58:00) [1]А зачем вообще TBitsmap? Scanlines для чего придуманы?
И уж во всяком случае заполнять TBitsmap через GetDIBits некорректно, т.к. пиксели в битмапе вовсе не обязательно идут одним куском, могут быть пустые вставки в конце строк (длина строки в байтах выравнивается на 4).
Магедон (2006-10-11 11:01:00) [2]Ничего не изменилось. Все так же на второй попытке получить массив, не дает
Магедон (2006-10-11 10:52:00) [3]Rouse_
> Наверное ошибка вот тут: biHeight := -wHeight;
Майкрософты
> biHeight
> Specifies the height of the bitmap, in pixels. If biHeight
> is positive, the bitmap is a bottom-up DIB and its origin
> is the lower left corner. If biHeight is negative, the bitmap
> is a top-down DIB and its origin is the upper left corner.
Rouse_
> Вторая ошибка в том что ты не к
> говоришь какой формат у изображения...
Магедон
> biBitCount := GetPixFormat(bmWork);
function GetPixFormat(bmWork: TBitmap):integer;
begin
case bmWork.PixelFormat of
pf1bit : Result := 1;
pf4bit : Result := 4;
pf8bit : Result := 8;
pf16bit : Result := 16;
pf24bit : Result := 24;
pf32bit : Result := 32;
else
Result := 32;
end
end;
Rouse_
> то использовать нужно не структуру TRGBTriple (которая у
> тебя кстати неверно заменена неверно объявленной RGB), а
> структуру TRGBQuad
А вот это попробую
Rouse_ (2006-10-11 09:31:00) [4]Наверное ошибка вот тут: biHeight := -wHeight;
Вторая ошибка в том что ты не к
говоришь какой формат у изображения, если он pf32bit, то использовать нужно не структуру TRGBTriple (которая у тебя кстати неверно заменена неверно объявленной RGB), а структуру TRGBQuad
Ketmar (2006-10-10 22:15:00) [5]всё. я пас.
Магедон (2006-10-10 21:55:00) [6]ну это ошибку не устранило. Почему когда второй раз пытаюсь заполнить массив он не копирует?
GetDIBits(bmWork.Canvas.Handle,bmWork.Handle,0,wHeight,Bits,bInfo, DIB_RGB_COLORS) = 0
Что я не освободил или не переопределил, или что еще? В Хелпе по этому поводу ничего не сказано, или я чегото там не понял - родной у меня не аглицкий (ударение на первую букву).
Ketmar (2006-10-10 21:15:00) [7]молодец. проверяешь. и суёшь всё куда? правильно: в структуру, которая никогда не меняется. наивно считая, что винды -- телепаты, и сами обо всём должны догадаться. вот я и спрашиваю: нафига проверять то, что ни разу потом нигде не используешь?
Магедон (2006-10-10 20:46:00) [8]Я не знаю какие битмапы будут использоваться. Поэтому и проверяю. С графикой впервые столкнулся, вот и заполняю что люди говорят.
А если я еще не понял, что спрашиваешь, то объясни не издевайся, и так голова не варит под конец дня.
спасибо, что хоть вопрос не проигнорировал.
Ketmar (2006-10-10 20:27:00) [9]снова читаем [1]. пока не поймём, о чём именноя спросил.
Магедон (2006-10-10 20:12:00) [10]Майкрософты написали, что нужно заполнить первые шеть полей структуры.
Ketmar (2006-10-10 20:04:00) [11]а зачем проверять BitCount, если всё равно под него никак структуру не подстраиваешь?