Текущий архив: 2007.02.25;
Скачать: CL | DM;
ВнизGetDiBits, где ошибка? Найти похожие ветки
← →
Магедон (2006-10-10 19:54) [0]Доброе время суток.
Вот код:
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.
Подскажите, пожайлуста, в чем загвоздка.
← →
Ketmar © (2006-10-10 20:04) [1]а зачем проверять BitCount, если всё равно под него никак структуру не подстраиваешь?
← →
Магедон (2006-10-10 20:12) [2]Майкрософты написали, что нужно заполнить первые шеть полей структуры.
← →
Ketmar © (2006-10-10 20:27) [3]снова читаем [1]. пока не поймём, о чём именно я спросил.
← →
Магедон (2006-10-10 20:46) [4]Я не знаю какие битмапы будут использоваться. Поэтому и проверяю. С графикой впервые столкнулся, вот и заполняю что люди говорят.
А если я еще не понял, что спрашиваешь, то объясни не издевайся, и так голова не варит под конец дня.
спасибо, что хоть вопрос не проигнорировал.
← →
Ketmar © (2006-10-10 21:15) [5]молодец. проверяешь. и суёшь всё куда? правильно: в структуру, которая никогда не меняется. наивно считая, что винды -- телепаты, и сами обо всём должны догадаться. вот я и спрашиваю: нафига проверять то, что ни разу потом нигде не используешь?
← →
Магедон (2006-10-10 21:55) [6]ну это ошибку не устранило. Почему когда второй раз пытаюсь заполнить массив он не копирует?
GetDIBits(bmWork.Canvas.Handle,bmWork.Handle,0,wHeight,Bits,bInfo, DIB_RGB_COLORS) = 0
Что я не освободил или не переопределил, или что еще? В Хелпе по этому поводу ничего не сказано, или я чегото там не понял - родной у меня не аглицкий (ударение на первую букву).
← →
Ketmar © (2006-10-10 22:15) [7]всё. я пас.
← →
Rouse_ © (2006-10-11 09:31) [8]Наверное ошибка вот тут: biHeight := -wHeight;
Вторая ошибка в том что ты не к
говоришь какой формат у изображения, если он pf32bit, то использовать нужно не структуру TRGBTriple (которая у тебя кстати неверно заменена неверно объявленной RGB), а структуру TRGBQuad
← →
Магедон (2006-10-11 10:52) [9]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
А вот это попробую
← →
Магедон (2006-10-11 11:01) [10]Ничего не изменилось. Все так же на второй попытке получить массив, не дает
← →
Sapersky (2006-10-11 13:58) [11]А зачем вообще TBitsmap? Scanlines для чего придуманы?
И уж во всяком случае заполнять TBitsmap через GetDIBits некорректно, т.к. пиксели в битмапе вовсе не обязательно идут одним куском, могут быть пустые вставки в конце строк (длина строки в байтах выравнивается на 4).
Страницы: 1 вся ветка
Текущий архив: 2007.02.25;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.063 c