Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.01 c
3-37509
AlexMan
2003-12-11 15:43
2004.01.13
Коннект с удаленной MySQL


1-37732
Evgeny78
2003-12-30 11:33
2004.01.13
как сделать приложение видимым


7-37966
dvp
2003-10-31 10:12
2004.01.13
Свойства - вкладка Доступ


1-37750
LeWorm
2003-12-28 12:19
2004.01.13
Размер Scroll а


1-37630
Cyberjack
2003-12-27 19:18
2004.01.13
DHTMLEdit





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