Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.14;
Скачать: CL | DM;

Вниз

hDIB для TBitmap   Найти похожие ветки 

 
Unknown user ©   (2005-06-11 22:19) [0]

Нашел функцию RotateBitmap(var hDIB: HGlobal; radang: Double; clrBack: TColor): Boolean для поворота изображения на угол radang. Но не могу придумать как добыть hDIB из TBitmap. Дело в том, что дальше в функции идут такие строки:

lpbi := PBitmapInfoHeader(GlobalLock(hdIB));
nHeaderSize := lpbi^.biSize + lpbi^.biClrUsed * SizeOf(TRGBQUAD);
lpDIBBits := Pointer(Longint(lpbi) + nHeaderSize);

где

lpDIBBits: Pointer;
lpbi, hDIBResult: PBitmapInfoHeader;

т.е, подразумевается что в функцию передается ссылка на TBitmapInfoHeader за которым непосредственно следуют биты изображения. Как мне получить hDIB для TBitmap?


 
Ученик   (2005-06-11 22:36) [1]

>Unknown user ©   (11.06.05 22:19)  

Не знаю есть ли в Delphi 5



{ Graphics.pas }

procedure GetDIBSizes(Bitmap: HBITMAP; var InfoHeaderSize: DWORD;
 var ImageSize: DWORD);
function GetDIB(Bitmap: HBITMAP; Palette: HPALETTE; var BitmapInfo; var Bits): Boolean;



 
Unknown user ©   (2005-06-11 22:56) [2]

2 Ученик
Для var BitmapInfo; var Bits в GetDIB надо предварительно выделить память, размер которой и возращает GetDIBSizes. Меня это не усраивает так как изображения с которыми я работаю большие и создавать его копию в памяти нежелательно, и потом за var BitmapInfo точно следует само изображение? По моему это две разные структуры в памяти.


 
Ученик   (2005-06-11 23:21) [3]

>Unknown user ©   (11.06.05 22:56) [2]

 GetDIBSizes(Bitmap.Handle, BitmapInfoSize, BitmapBitsSize);
 DIB := AllocMem(BitmapInfoSize + BitmapBitsSize);
 try
   Bits := Pointer(DWORD(Bitmap) + BitmapInfoSize);
   ...
 finally
   FreeMem(DIB)
 en;


 
Ученик   (2005-06-11 23:24) [4]

>Ученик   (11.06.05 23:21) [3]

Поправка

 Bits := Pointer(DWORD(DIB) + BitmapInfoSize);


 
-=XP=- ©   (2005-06-12 08:20) [5]

Bitmap.Handle?


 
Ученик   (2005-06-12 10:17) [6]

>-=XP=- ©   (12.06.05 08:20) [5]



procedure TForm1.Button1Click(Sender: TObject);
begin
 with TBitmap.Create do try
   Width  := 16;
   Height := 16;
   case HandleType of
     bmDIB: ShowMessage("DIB");
     bmDDB: ShowMessage("DDB");
   end
 finally
   Free
 end
end;



 
Unknown user ©   (2005-06-13 10:10) [7]

2 Ученик.
Спасибо за совет по размещению одной структуры в памяти непосредственно за другой. Но есть ли способ для TBitmap получить ссылку на область TBitmapInfo, считанную из файла. Хранится ли она вообще в памяти. А ссылку на BitmapBits возращает ScanLine[Bitmap.Height-1]. Верно?


 
Ученик   (2005-06-13 19:35) [8]

>Unknown user ©   (13.06.05 10:10) [7]
Для TBitmap считанного из файла скорее всего будет HandleType=bmDIB, поэтому почему бы не попробовать вариант -=XP=- ©   (12.06.05 08:20) [5] :-)

>А ссылку на BitmapBits возращает ScanLine[Bitmap.Height-1]. Верно?

Не всегда



function TBitmap.GetScanLine(Row: Integer): Pointer;
begin
 Changing(Self);
 with FImage.FDIB, dsbm, dsbmih do
 begin
   if (Row < 0) or (Row >= bmHeight) then
     InvalidOperation(@SScanLine);
   DIBNeeded;
   GDIFlush;
   if biHeight > 0 then  // bottom-up DIB
     Row := biHeight - Row - 1;
   Integer(Result) := Integer(bmBits) +
     Row * BytesPerScanline(biWidth, biBitCount, 32);
 end;
end;



Страницы: 1 вся ветка

Текущий архив: 2005.08.14;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.028 c
3-1120471111
Yurisimus
2005-07-04 13:58
2005.08.14
Верхний регистр в ADOQuery


14-1121760989
kaif
2005-07-19 12:16
2005.08.14
СПАМ


3-1120556071
Жук
2005-07-05 13:34
2005.08.14
Индексация поля


14-1122357192
Ega23
2005-07-26 09:53
2005.08.14
С днем рождения! 26 июля


1-1122290833
chili
2005-07-25 15:27
2005.08.14
Бинарные файлы