Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.48 MB
Время: 0.01 c
3-93818
Zelius
2004-02-04 12:23
2004.02.29
Помогите разобраться, от чего выскакивает ошибка?


3-93789
magic
2004-02-01 16:14
2004.02.29
DBLookupComboBox


11-93824
Евгений
2003-06-06 10:23
2004.02.29
KolZLib


14-94149
Lancelot
2004-02-05 14:39
2004.02.29
Игрушка TRON 2.0


4-94242
volser
2003-11-06 12:23
2004.02.29
Hook мыши





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский