Форум: "WinAPI";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.013 c