Другие языки программирования и технологии
как в дельфи сделать скриншот какого то поля?
Есть 2 поле Image, один на другом, причём один перекрывается другим, я хочу сохранить вилимую картинку (то есть 1 и часть второго Image) в 3 Image
Давайте я вам расскажу)) ) и так, в Windows есть такая чудо-процедура. называется BitBlt(source : HDC, x,y : integer; width,height : integer; dest : HDC; MODE : integer);
Она копирует изображение одного компонента на другой. естественно, нашим вторым компонентом скорее всего, будет Bitmap. HDC - это дескриптор Canvas`a, упомянутого выше. Как получить дескриптор Canvas`a? очень просто, процедурой GetDC(Handle), где Handle - это дескриптор компонента. И так, все знаем, все гттово - впуть!)) )
Допустим, вы хотиде сделать скриншот вашего Мемо с текстом, а канваса - то у него отродясь не было! Вот не задача, да? ну и что, у нас зато есть memo1.handle, и bitBlt!
И так, начнем:
//Сорри если что, писал попамяти
uses windows, graphics, sysutuils;
procedure TForm1.button1_click(Sender : TObject)
Var
bitmap: TBitmap;//Картинка-скриншот
memoHDC : HDC;
bmpHDC : HDC:
Begin
bitmap:=TBitmap.create;
try
//След 2 строки обязательны!
bitmap.width:=Memo1.width;
bitmap.height:=Memo1.height;
MemoHdc:=getDC(Memo1.handle);//Узнаем, где валяется картинка мемо)) )
bmpHDC:=bitmap.canvas.handle;//Если в Канвас есть свойство с типом HDC, лучше используйте его!
BitBlt(MemoHDC, 0, 0, Memo1.width, memo1.height, bmpHDC, SRCCOPY);
//Замечание: пустая моя голова! если не найдет константу SRCCOPY, попробуйте так: SRC_COPY
//Если после этого картинка будет черная, попробуйте MemoHDC и BMPHDC поменять местами
bitmap.save(ExtractFileDir(ParamStr(0)) + '\1.bmp');
finally
bmp.free;
end;
end;
И ещё: с помощью этой процедуры можно рисовать на других окнах! ! Сначала рисуем bitmap, а потом при помощи процедуры кидаем его на нужным нам компонент)) )
Я старался, не сочтите за наглость, но мне было бы приятно. если бы мой ответ оказался лучшим!
P.S. DELPHI forever!
В вашем примере можно поступить так:
Bitmap:=TBitmap.create;//Image2 должна быть правее и ниже Image 1
bitmap.width:=Image2.width + (Image2.left - Image1.left);//Узнаем общёю ширину картинок
Bitmap.height:=IMage2.height + (IMage2.top - Image1.top);//Аналогично
//Рисование нижней картинки:
Bitmap.canvas.draw(Image2.left - Image1.left, Image2.top - Image1.top, IMage2.picture.bitmap.canvas);
//Рисуем верхнюю поверх нижней:
Bitmap.canvas.draw(0, 0, IMage1.picture.bitmap.canvas);
Bitmap.save('1.bmp');
bitmap.free;
Она копирует изображение одного компонента на другой. естественно, нашим вторым компонентом скорее всего, будет Bitmap. HDC - это дескриптор Canvas`a, упомянутого выше. Как получить дескриптор Canvas`a? очень просто, процедурой GetDC(Handle), где Handle - это дескриптор компонента. И так, все знаем, все гттово - впуть!)) )
Допустим, вы хотиде сделать скриншот вашего Мемо с текстом, а канваса - то у него отродясь не было! Вот не задача, да? ну и что, у нас зато есть memo1.handle, и bitBlt!
И так, начнем:
//Сорри если что, писал попамяти
uses windows, graphics, sysutuils;
procedure TForm1.button1_click(Sender : TObject)
Var
bitmap: TBitmap;//Картинка-скриншот
memoHDC : HDC;
bmpHDC : HDC:
Begin
bitmap:=TBitmap.create;
try
//След 2 строки обязательны!
bitmap.width:=Memo1.width;
bitmap.height:=Memo1.height;
MemoHdc:=getDC(Memo1.handle);//Узнаем, где валяется картинка мемо)) )
bmpHDC:=bitmap.canvas.handle;//Если в Канвас есть свойство с типом HDC, лучше используйте его!
BitBlt(MemoHDC, 0, 0, Memo1.width, memo1.height, bmpHDC, SRCCOPY);
//Замечание: пустая моя голова! если не найдет константу SRCCOPY, попробуйте так: SRC_COPY
//Если после этого картинка будет черная, попробуйте MemoHDC и BMPHDC поменять местами
bitmap.save(ExtractFileDir(ParamStr(0)) + '\1.bmp');
finally
bmp.free;
end;
end;
И ещё: с помощью этой процедуры можно рисовать на других окнах! ! Сначала рисуем bitmap, а потом при помощи процедуры кидаем его на нужным нам компонент)) )
Я старался, не сочтите за наглость, но мне было бы приятно. если бы мой ответ оказался лучшим!
P.S. DELPHI forever!
В вашем примере можно поступить так:
Bitmap:=TBitmap.create;//Image2 должна быть правее и ниже Image 1
bitmap.width:=Image2.width + (Image2.left - Image1.left);//Узнаем общёю ширину картинок
Bitmap.height:=IMage2.height + (IMage2.top - Image1.top);//Аналогично
//Рисование нижней картинки:
Bitmap.canvas.draw(Image2.left - Image1.left, Image2.top - Image1.top, IMage2.picture.bitmap.canvas);
//Рисуем верхнюю поверх нижней:
Bitmap.canvas.draw(0, 0, IMage1.picture.bitmap.canvas);
Bitmap.save('1.bmp');
bitmap.free;
Пишу по памяти:
У любого наследника TGraphic есть свойство canvas со всякими методами, типа получается нечто вроде примерно так:
Image3.Canvas.bitmap.assign(Form1.canvas.bitmap);
Как-то в этом направлении я бы копал.
Т. е. береь канвас формы (на котоорой image1 + mage2 сидят) и делаешь присвоение его в Image3
У любого наследника TGraphic есть свойство canvas со всякими методами, типа получается нечто вроде примерно так:
Image3.Canvas.bitmap.assign(Form1.canvas.bitmap);
Как-то в этом направлении я бы копал.
Т. е. береь канвас формы (на котоорой image1 + mage2 сидят) и делаешь присвоение его в Image3
Gadwin Print Screen
В настройках поставь "Прямоугольная область" И курсором выделяй ту часть которую хочешь сфотографировать.
Сам курсор можно спрятать, так же в настройках.
В настройках поставь "Прямоугольная область" И курсором выделяй ту часть которую хочешь сфотографировать.
Сам курсор можно спрятать, так же в настройках.
Похожие вопросы
- Как сделать скриншот экрана с прокруткой
- Как сделать скриншот рабочего стола C#
- Как сделать скриншоты?
- как сделать скриншот страницы? фото страницы..
- Как сделать скриншот рабочего стола???
- Как сделать скриншот страницы приветствия в Windows7
- Как сделать скриншот страницы? Если не нажимается клавиши Принт Скрин ? :( я на неё нажимаю, а она никак не реагирует (
- как сделать скриншот экрана?
- как сделать скриншот если отсутствует клавиша fn? Папа утверждает что у него нет этой кнопки на клаве.
- Как сделать скриншот экрана?
Assign может вызывать ошибку преобразования.
Делайте так:
Image1.picture.canvas.copyRect(RECT(0,0, Image1.width, Image1.Height), Image2.picture.canvas, Image2.Picture.Bitmap.Cliprect);