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

Вниз

TBitmap не хочет сохранять картинку   Найти похожие ветки 

 
acp ©   (2003-05-26 23:32) [0]

Точнее сохраняет, но не совсем то. А именно, сохраняется простой чёрный фон. Может кто что подскажет? Тыкнет носом в ошибку?

TmpBMP := NewBitmap(100, 100);
with SrcRect do
begin
Left := 10;
Top := 10;
Right := 50;
Bottom := 50;
end;

//TmpBMP.Canvas.ModeCopy := cmSrcCopy;
TmpBMP.Canvas.CopyRect(SrcRect, LBMP.Canvas, SrcRect);
TmpBMP.SaveToFile(FileName);

PS: код по моему, достаточно ясный. В VCL аналогичное работает. Посмотрел реализацию CopyRect, вроде всё нормально...


 
puky   (2003-05-26 23:59) [1]

Выставь pixelformat.
Вот рабочий пример:

procedure TForm1.Button1Click(Sender: PObj);
var
tmpbmp : PBitmap;
SrcRect : TRect;
begin
tmpbmp := NewDIBBitmap( 100, 100, pf24bit );
with tmpbmp^ do begin
SrcRect := MakeRect( 0, 0, 100, 400 );
Canvas.CopyRect( SrcRect, Form.Canvas, SrcRect );
( "c:\1.bmp" ) [1]
Выставь pixelformat.
Вот рабочий пример:

procedure TForm1.Button1Click(Sender: PObj);
var
tmpbmp : PBitmap;
SrcRect : TRect;
begin
tmpbmp := NewDIBBitmap( 100, 100, pf24bit );
with tmpbmp^ do begin
SrcRect := MakeRect( 0, 0, 100, 400 );
Canvas.CopyRect( SrcRect, Form.Canvas, SrcRect );
SaveToFile( "c:\1.bmp" );
Free;
end;
end;


 
acp ©   (2003-05-27 00:14) [2]

Да... Может быть это и работает. В принципе, не суть важно. Для меня важнее вопрос - _почему_ не работает, почему выставление BPP решает эту проблема?


 
Кладов   (2003-05-28 22:43) [3]

Причину нашел. Точнее, нашел, как исправить. Вот код NewBitmap.

function NewBitmap( W, H: Integer ): PBitmap;
var DC: HDC;
begin
New( Result, Create );
Result.fHandleType := bmDDB;
Result.fDetachCanvas := DummyDetachCanvas;
Result.fWidth := W;
Result.fHeight := H;
if (W <> 0) and (H <> 0) then
begin
//DC := CreateCompatibleDC( 0 );
DC := GetDC( 0 );
Result.fHandle := CreateCompatibleBitmap( DC, W, H );
Assert( Result.fHandle <> 0, "Can not create bitmap handle" );
//DeleteDC( DC );
( 0, DC ) [3]
Причину нашел. Точнее, нашел, как исправить. Вот код NewBitmap.

function NewBitmap( W, H: Integer ): PBitmap;
var DC: HDC;
begin
New( Result, Create );
Result.fHandleType := bmDDB;
Result.fDetachCanvas := DummyDetachCanvas;
Result.fWidth := W;
Result.fHeight := H;
if (W <> 0) and (H <> 0) then
begin
//DC := CreateCompatibleDC( 0 );
DC := GetDC( 0 );
Result.fHandle := CreateCompatibleBitmap( DC, W, H );
Assert( Result.fHandle <> 0, "Can not create bitmap handle" );
//DeleteDC( DC );
ReleaseDC( 0, DC );
end;
end;


Закомментаренные строки заменены жирными. Теперь бы еще найти причину, почему так правильно, а так, как было, давало монохромный битмап :)



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

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

Наверх




Память: 0.47 MB
Время: 0.024 c
3-29220
Innokenty
2004-01-20 07:08
2004.02.10
Соединение 4-х баз по дате и сортировка


14-29524
гогениус
2004-01-21 19:42
2004.02.10
Нужна ваша помощь


14-29586
copyr25
2004-01-10 16:53
2004.02.10
---|Ветка была без названия|---


3-29266
grusty
2004-01-17 16:20
2004.02.10
Как подсчитать количество уникальных записей в таблице?


1-29324
SeLarin
2004-01-29 15:01
2004.02.10
TLabel.Color