![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
hDIB для TBitmap [D5, Win2k]
Unknown user © (2005-06-11 22:19:00)Нашел функцию 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-13 19:35:00) [1]>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;
Unknown user (2005-06-13 10:10:00) [2]2 Ученик.
Спасибо за совет по размещению одной структуры в памяти непосредственно за другой. Но есть ли способ для TBitmap получить ссылку на область TBitmapInfo, считанную из файла. Хранится ли она вообще в памяти. А ссылку на BitmapBits возращает ScanLine[Bitmap.Height-1]. Верно?
Ученик (2005-06-12 10:17:00) [3]>-=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;
-=XP=- (2005-06-12 08:20:00) [4]Bitmap.Handle?
Ученик (2005-06-11 23:24:00) [5]>Ученик (11.06.05 23:21) [3]
Поправка
Bits := Pointer(DWORD(DIB) + BitmapInfoSize);
Ученик (2005-06-11 23:21:00) [6]>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;
Unknown user (2005-06-11 22:56:00) [7]2 Ученик
Для var BitmapInfo; var Bits в GetDIB надо предварительно выделить память, размер которой и возращает GetDIBSizes. Меня это не усраивает так как изображения с которыми я работаю большие и создавать его копию в памяти нежелательно, и потом за var BitmapInfo точно следует само изображение? По моему это две разные структуры в памяти.
Ученик (2005-06-11 22:36:00) [8]>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;