Форум: "WinAPI";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];
Внизсохранение bitmap в файл Найти похожие ветки
← →
chi (2003-12-15 21:55) [0]Ув. мастера! хотелось бы создать динамически изображение и сохранить его в файл без использования стандартных классов и компонент. Заранее спасибо.
← →
chi (2003-12-15 22:11) [1]вот кусок кода
var
hdcScreen,hdcCompatible:HDC;
hbmScreen: Hbitmap;
info:TBitmapInfoHeader;
bmp:Tbitmap;
bits:Pointer;
begin
hdcScreen := GetDC(0);
hdcCompatible := CreateCompatibleDC(hdcScreen);
hbmScreen:= CreateCompatibleBitmap(hdcScreen,
GetDeviceCaps(hdcScreen, HORZRES),
GetDeviceCaps(hdcScreen, VERTRES));
Bmp := TBitmap.Create;
Bmp.Width := 300;
Bmp.Height:= 200;
if SelectObject(hdcCompatible, hbmScreen)<>0 then
showmessage("Compatible Bitmap Selection");
if not BitBlt(Bmp.Canvas.Handle,
0,0,
200, 300,
hdcScreen,
0,0,
SRCCOPY) then
showmessage("Screen to Compat Blt Failed");
with info.bmiHeader do begin
biWidth:=bmp.Width;
biHeight:=bmp.Height;
biSize:=SizeOf(TBITMAPINFOHEADER);
biCompression:=BI_RGB;
biBitCount:=32;
biPlanes:=1;
biSizeImage:=0;
end;
GetDIBits(bmp.canvas.handle, Bmp.Handle, 0,B.Height,bits,Info,DIB_RGB_COLORS);
// как теперь bits записать в файл??
end;
← →
крот (2003-12-16 08:08) [2]В MSDN описан формат *.bmp файла, по-моему, даже пример сохранения есть
← →
chi (2003-12-16 12:37) [3]
> крот (16.12.03 08:08) [2]
ну , честно говоря, не разобрался я :(
← →
крот (2003-12-17 09:28) [4]Тады, конкретный вопрос. Или посмотри как в Delphi сделано TBitmap.SaveToFile
← →
chi (2003-12-17 11:04) [5]
> крот (17.12.03 09:28) [4]
а там столько процедур промежуточных , хрен разберешься(ну, с моим опытом, по крайней мере:)
конкретный вопрос:
GetDIBits(bmp.canvas.handle, Bmp.Handle, 0,B.Height,bits,Info,DIB_RGB_COLORS);
// как теперь bits записать в файл??
← →
Digitman (2003-12-17 11:28) [6]
> хрен разберешься
вот ключевой код сохранения :
procedure TBitmap.WriteStream(Stream: TStream; WriteSize: Boolean);
const
PalSize: array [Boolean] of Byte = (sizeof(TRGBQuad), sizeof(TRGBTriple));
var
Size, ColorCount: DWORD;
HeaderSize: DWORD;
BMF: TBitmapFileHeader;
Save: THandle;
BC: TBitmapCoreHeader;
Colors: array [Byte] of TRGBQuad;
begin
FillChar(BMF, sizeof(BMF), 0);
BMF.bfType := $4D42;
if FImage.FSaveStream <> nil then
begin
Size := FImage.FSaveStream.Size + sizeof(BMF);
BMF.bfSize := Size;
if WriteSize then
Stream.WriteBuffer(Size, sizeof(Size));
Stream.Write(BMF, sizeof(BMF));
Stream.Write(FImage.FSaveStream.Memory^, FImage.FSaveStream.Size);
Exit;
end;
DIBNeeded;
with FImage do
begin
Size := 0;
if FDIBHandle <> 0 then
begin
InternalGetDIBSizes(FDIBHandle, HeaderSize, Size, FDIB.dsbmih.biClrUsed);
if FOS2Format then
begin // OS2 format cannot have partial palette
HeaderSize := sizeof(BC);
if FDIB.dsbmih.biBitCount <= 8 then
Inc(HeaderSize, sizeof(TRGBTriple) * (1 shl FDIB.dsbmih.biBitCount));
end;
Inc(Size, HeaderSize + sizeof(BMF));
FillChar(BMF, sizeof(BMF), 0);
BMF.bfType := $4D42;
Canvas.RequiredState([csHandleValid]);
Save := GDICheck(SelectObject(FCanvas.FHandle, FDIBHandle));
ColorCount := GetDIBColorTable(FCanvas.FHandle, 0, 256, Colors);
SelectObject(FCanvas.FHandle, Save);
// GetDIBColorTable always reports the full palette; trim it back for partial palettes
if (0 < FDIB.dsbmih.biClrUsed) and (FDIB.dsbmih.biClrUsed < ColorCount) then
ColorCount := FDIB.dsbmih.biClrUsed;
if (not FOS2Format) and (ColorCount = 0) and (FPalette <> 0) and not FHalftone then
begin
ColorCount := PaletteToDIBColorTable(FPalette, Colors);
if FDIB.dsbmih.biBitCount > 8 then
begin // optional color palette for hicolor images (non OS2)
Inc(Size, ColorCount * sizeof(TRGBQuad));
Inc(HeaderSize, ColorCount * sizeof(TRGBQuad));
end;
end;
BMF.bfSize := Size;
BMF.bfOffBits := sizeof(BMF) + HeaderSize;
end;
if WriteSize then Stream.WriteBuffer(Size, SizeOf(Size));
if Size <> 0 then
begin
FixupBitFields(FDIB);
if (ColorCount <> 0) then
begin
if (FDIB.dsbmih.biClrUsed = 0) or (FDIB.dsbmih.biClrUsed <> ColorCount) then
FDIB.dsbmih.biClrUsed := ColorCount;
if FOS2Format then RGBQuadToTriple(Colors, Integer(ColorCount));
end;
if FOS2Format then
begin
with BC, FDIB.dsbmih do
begin
bcSize := sizeof(BC);
bcWidth := biWidth;
bcHeight := biHeight;
bcPlanes := 1;
bcBitCount := biBitCount;
end;
Stream.WriteBuffer(BMF, sizeof(BMF));
Stream.WriteBuffer(BC, sizeof(BC));
end
else
begin
Stream.WriteBuffer(BMF, Sizeof(BMF));
Stream.WriteBuffer(FDIB.dsbmih, Sizeof(FDIB.dsbmih));
if (FDIB.dsbmih.biBitCount > 8) and
((FDIB.dsbmih.biCompression and BI_BITFIELDS) <> 0) then
Stream.WriteBuffer(FDIB.dsBitfields, 12);
end;
Stream.WriteBuffer(Colors, ColorCount * PalSize[FOS2Format]);
Stream.WriteBuffer(FDIB.dsbm.bmBits^, FDIB.dsbmih.biSizeImage);
end;
end;
end;
что здесь тебе непонятно ?
← →
chi (2003-12-17 11:38) [7]if FImage.FSaveStream... и подобные ссылки на сторонние процедуры меня запутывают сташно(а еще под сессию :), неужеле более тривиального способа нет?
← →
Digitman (2003-12-17 12:32) [8]
> подобные ссылки на сторонние процедуры меня запутывают сташно
это печально
пока ты не будешь свободно ориентироваться в чужом OP-тексте, ничего путного из тебя как Делфи-программера не выйдет
> неужеле более тривиального способа нет?
все, что тебе нужно сделать - это получить объект hBitmap: HBITMAP, содержащий готовое изображение, и назначить св-во :
MyBitmap.Handle := hBitmap;
← →
chi (2003-12-17 13:22) [9]дело в том, что задача моя в "низкоуровневой" записи в файл., т.е. этот массив из байт bits нужно самостоятельно записать в файл
← →
Digitman (2003-12-17 13:33) [10]ну так и смотри, как это делается в методе TBitmap.SetHandle() и последующем вызове TBitmap.WriteStream() ! Все "потроха" этих методов и есть "низкоуровневая" запись !
← →
chi (2003-12-17 13:53) [11]а еще ведь canvas :( вообщем помощи ждать неоткуда :)
← →
chi (2003-12-17 14:32) [12]и как этот bits разбить на строки ??
← →
chi (2003-12-18 00:46) [13]Digitman, если можно пример кода с подобными операциями
← →
chi (2003-12-20 18:16) [14]не знают :)
← →
Avenger[NhT] (2003-12-20 19:39) [15]Смотри здесь библиотеку Avl: www.nht-team.org/forum/
В разделе програмирование. Она позволит использовать битмам при размере программы 15кб! также там много других возможностей...
← →
chi (2003-12-21 20:20) [16]
> Avenger[NhT] (20.12.03 19:39) [15]
> Смотри здесь библиотеку Avl: www.nht-team.org/forum/
> В разделе програмирование. Она позволит использовать битмам
> при размере программы 15кб! также там много других возможностей...
к сожалению у Tbitmap там нет процедуры savetofile (
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.011 c