Главная страница
    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.47 MB
Время: 0.042 c
11-1149274717
GMax
2006-06-02 22:58
2007.02.25
Картинки в ListView. не только в первой колонке


15-1170606291
Calibr
2007-02-04 19:24
2007.02.25
JavaScript


1-1167327617
guitarist
2006-12-28 20:40
2007.02.25
Поиск строки в большом файле


15-1170296895
Дом
2007-02-01 05:28
2007.02.25
Нет ли какого нибудь устройства, чтоб подключать к компу и управл


4-1160766541
gellmar
2006-10-13 23:09
2007.02.25
Как реализовать парсинг PE64 файлов под win32 на делфи?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский