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

Вниз

В чем моя ошибка?   Найти похожие ветки 

 
DimaK ©   (2003-12-24 22:50) [0]

Целый день убил, так что-то и не понял. Вот мой код:

procedure TForm1.SaveBitmap;
var Bitmap: TBitmap;
MyRect: TRect;
begin
// Задание координат копирования (отступ слева, сверху, ширина, высота)
MyRect:=Rect(Panel1.Left+Image1.Left,
Panel1.Top+Image1.Top,
Panel1.Left+Image1.Width,
Panel1.Top+Image1.Height);
//
Bitmap:=TBitmap.Create;
Bitmap.Width:=547;
Bitmap.Height:=316;
//
try
with Bitmap.Canvas do
CopyRect(Clientrect, Canvas, MyRect);
Bitmap.SaveToFile(SavePictureDialog1.FileName);
finally
Bitmap.Free;
end;
end;

Суть такая, допустим на форме где-то лежит Panel1, на котором лежит Image1. Загружаю картинку (bmp) в Image. Далее допустим создаю ротомок Label, и распологаю его на картинке. В итоге получается картинка, на которой в определенных местах есть текст (те самые созданные Label). Вот теперь надо эту картинку сохранить (вместе с текстом), т.е. скопировать экран именно в координатах нахождения Image и сохранить его в файл.
Да совсем забыл, файл должен быть 547 точек по ширине и 316 по высоте.
Мой код впринципе все делает, но он почему-то масштабирует картинку, в итоге получается, что вырезает, сохраняет, но картинка получается больше (где-то 715 на 400), естественно получается обрезанная и как-бы увеличенная из за чего теряется и качество.
Может кто знает как правильно скопировать экран по определенным координатам, буду очень благодарен!


 
Anatoly Podgoretsky ©   (2003-12-24 23:07) [1]

Убери with и поставь точку останова на Bitmap.SaveToFile и посмотри Width/Height


 
DimaK ©   (2003-12-25 00:16) [2]

Так дело в том, что я не могу поставить точку остановки, делфя в этот момент выполняет недопустимую операцию :(


 
Думкин ©   (2003-12-25 07:23) [3]

Допустим
Image1.Left = 100;
Image1.Width = 50;

А теперь скажи что у тебя в MyRect.


 
Babay ©   (2003-12-25 08:00) [4]

А может лучше просто отрисовать перед сохранением лабельки на битмапе и сохранить, а затем битмап восстановить.


 
BaDeVlad ©   (2003-12-25 09:12) [5]

Что у тебя получается? если убрать with:

Bitmap.Canvas.CopyRect(Clientrect, Bitmap.Canvas, MyRect);

по-моему так?


 
Думкин ©   (2003-12-25 09:17) [6]


> [5] BaDeVlad © (25.12.03 09:12)

Нет, не это.


 
Teetotaller   (2003-12-25 09:41) [7]

В CopyRect - ClientRect, это прямоугольник формы, не битмапа.
Сам подумай.
Вот и получается растягивание при копировании.


 
TUser ©   (2003-12-25 09:46) [8]

А тебе это все озязательно через Label делать? C TextOut"ом вообще думать не придется, и быстрее будет.


 
DimaK ©   (2003-12-25 23:15) [9]

Большое спасибо всем, всетаки натолкнули на мысль :)
Все получилось, если кому интересно как скопировать область экрана по координатам отдельного компонента, смотрите код:

function GetSystemPalette : HPalette;
var PaletteSize:integer;
LogSize:integer;
LogPalette:PLogPalette;
DC : HDC;
Focus : HWND;
begin
result:=0;
Focus:=GetFocus;
DC:=GetDC(Focus);
try
PaletteSize:=GetDeviceCaps(DC, SIZEPALETTE);
LogSize:=SizeOf(TLogPalette)+(PaletteSize-1)*SizeOf(TPaletteEntry);
GetMem(LogPalette, LogSize);
try
with LogPalette^ do
begin
palVersion:=$0300;
palNumEntries:=PaletteSize;
GetSystemPaletteEntries(DC, 0, PaletteSize, palPalEntry);
end;
result:=CreatePalette(LogPalette^);
finally
FreeMem(LogPalette, LogSize);
end;
finally
ReleaseDC(Focus, DC);
end;
end;

function CaptureScreenRect(ARect : TRect) : TBitmap;
var ScreenDC : HDC;
begin
Result:=TBitmap.Create;
with result, ARect do
begin
Width:=Right-Left;
Height:=Bottom-Top;
ScreenDC:=GetDC(0);
try
BitBlt(Canvas.Handle, 0,0,Width,Height,ScreenDC, Left, Top, SRCCOPY );
finally
ReleaseDC(0, ScreenDC);
end;
Palette:=GetSystemPalette;
end;
end;

function CaptureClientImage(Control : TControl) : TBitmap;
begin
with Control, Control.ClientOrigin do
result:=CaptureScreenRect(Bounds(X,Y,ClientWidth,ClientHeight));
end;

procedure TForm1.Button1Click(Sender: TObject);
var bmp: TBitmap;
begin
bmp:=TBitmap.Create;
bmp.Width:=546;
bmp.Height:=316;
bmp:=CaptureClientImage(Image1);
bmp.SaveToFile("c:\screen.bmp");
bmp.Free;
end;



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

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

Наверх




Память: 0.49 MB
Время: 0.02 c
3-37568
CraKer
2003-12-14 00:03
2004.01.13
Filter не делается по значениям с пробелом...


3-37574
Amigo Sv
2003-12-15 08:15
2004.01.13
Как создать запрос из поля


3-37559
Vick
2003-12-17 10:33
2004.01.13
Нет доступа при чтении файлов -ем с другого сервера


1-37637
tria
2003-12-30 20:07
2004.01.13
Стандартные Action - как выполнить по ним свой код?


3-37569
bon
2003-12-15 10:43
2004.01.13
Query