Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.03 c
15-1170498917
beginner90
2007-02-03 13:35
2007.02.25
установка ZEOSDBO-6.6.0-beta


2-1170530626
Лебедев
2007-02-03 22:23
2007.02.25
memo


15-1170156228
Calibr
2007-01-30 14:23
2007.02.25
Вопрос по HTML?


5-1149104734
Phoroon~
2006-05-31 23:45
2007.02.25
Загрузка из ресурсов


1-1168005013
Igor_Z
2007-01-05 16:50
2007.02.25
Вкладки в свойстве файла