「java截图保存」截图和草图自动保存

博主:adminadmin 2022-11-30 23:26:08 52

今天给各位分享java截图保存的知识,其中也会对截图和草图自动保存进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

JAVA 截屏函数

有啊 核心提示:函数需要 uses Direct3D9,D3DX9; 偶然发现一个函数可以直接保存表面到文件1!所以修改了一下,函数为:...

procedure CaptureScreen(Const FileName: string);

var

BitsPerPixel: Byte;

pD3D: IDirect3D9;

pSurface: IDirect3DSurface9;

g_pD3DDevice: IDirect3DDevice9;

D3DPP: TD3DPresentParameters;

ARect: TRect;

LockedRect: TD3DLockedRect;

BMP: TBitmap;

i, p: Integer;

begin

BitsPerPixel := GetDeviceCaps(Canvas.Handle, BITSPIXEL);

FillChar(d3dpp, SizeOf(d3dpp), 0);

D3DPP.Windowed := True;

D3DPP.Flags := D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;

D3DPP.SwapEffect := D3DSWAPEFFECT_DISCARD;

D3DPP.BackBufferWidth := Screen.Width;

D3DPP.BackBufferHeight := Screen.Height;

D3DPP.BackBufferFormat := D3DFMT_X8R8G8B8;

pD3D := Direct3DCreate9(D3D_SDK_VERSION);

pD3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow,

D3DCREATE_SOFTWARE_VERTEXPROCESSING, @D3DPP, g_pD3DDevice);

g_pD3DDevice.CreateOffscreenPlainSurface(Screen.Width, Screen.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, pSurface, nil);

g_pD3DDevice.GetFrontBufferData(0, pSurface);

// use D3D to save surface. Notes: D3DX%ab.dll is required!

// D3DXSaveSurfaceToFile('Desktop.bmp', D3DXIFF_BMP, pSurface, nil, nil);

// use Bitmap to save surface

ARect := Screen.DesktopRect;

pSurface.LockRect(LockedRect, @ARect, D3DLOCK_NO_DIRTY_UPDATE or D3DLOCK_NOSYSLOCK or D3DLOCK_READONLY);

BMP := TBitmap.Create;

BMP.Width := Screen.Width;

BMP.Height := Screen.Height;

case BitsPerPixel of

8: BMP.PixelFormat := pf8bit;

16: BMP.PixelFormat := pf16bit;

24: BMP.PixelFormat := pf24bit;

32: BMP.PixelFormat := pf32bit;

end;

p := Cardinal(LockedRect.pBits);

for i := 0 to Screen.Height - 1 do

begin

CopyMemory(BMP.ScanLine[i], Ptr(p), Screen.Width * BitsPerPixel div 8);

p := p + LockedRect.Pitch;

end;

BMP.SaveToFile(FileName);

BMP.Free;

pSurface.UnlockRect;

end;

procedure CaptureScreen(const FileName: string;Const FileType: TD3DXImageFileFormat);

var

pD3D: IDirect3D9;

pSurface: IDirect3DSurface9;

g_pD3DDevice: IDirect3DDevice9;

D3DPP: TD3DPresentParameters;

begin

FillChar(d3dpp, SizeOf(d3dpp), 0);

D3DPP.Windowed := True;

D3DPP.Flags := D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;

D3DPP.SwapEffect := D3DSWAPEFFECT_DISCARD;

D3DPP.BackBufferWidth := Screen.Width;

D3DPP.BackBufferHeight := Screen.Height;

D3DPP.BackBufferFormat := D3DFMT_X8R8G8B8;

pD3D := Direct3DCreate9(D3D_SDK_VERSION);

pD3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow,

D3DCREATE_SOFTWARE_VERTEXPROCESSING, @D3DPP, g_pD3DDevice);

g_pD3DDevice.CreateOffscreenPlainSurface(Screen.Width, Screen.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, pSurface, nil);

g_pD3DDevice.GetFrontBufferData(0, pSurface);

D3DX9.D3DXSaveSurfaceToFile(PChar(FileName),FileType,pSurface,nil,nil);

pSurface := nil;

g_pD3DDevice := nil;

pD3D := nil;

end;

传递两个参数,第一个参数指定为文件名,第二个参数指定为文件类型

支持7种类型

_D3DXIMAGE_FILEFORMAT = (

D3DXIFF_BMP {= 0},

D3DXIFF_JPG {= 1},

D3DXIFF_TGA {= 2},

D3DXIFF_PNG {= 3},

D3DXIFF_DDS {= 4},

D3DXIFF_PPM {= 5},

D3DXIFF_DIB {= 6}

);

再给一个使用dX8实现的,上面给的是用Dx9实现的函数

procedure CaptureScreen(const FileName: string;Const FileType: TD3DXImageFileFormat);

var

pD3D: IDirect3D8;

pSurface: IDirect3DSurface8;

g_pD3DDevice: IDirect3DDevice8;

D3DPP: TD3DPresentParameters;

begin

FillChar(d3dpp, SizeOf(d3dpp), 0);

D3DPP.Windowed := True;

D3DPP.Flags := D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;

D3DPP.SwapEffect := D3DSWAPEFFECT_DISCARD;

D3DPP.BackBufferWidth := Screen.Width;

D3DPP.BackBufferHeight := Screen.Height;

D3DPP.BackBufferFormat := D3DFMT_X8R8G8B8;

pD3D := Direct3DCreate8(D3D_SDK_VERSION);

pD3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow,

D3DCREATE_SOFTWARE_VERTEXPROCESSING, D3DPP, g_pD3DDevice);

g_pD3DDevice.CreateImageSurface(Screen.Width, Screen.Height, D3DFMT_A8R8G8B8, pSurface);

g_pD3DDevice.GetFrontBuffer(pSurface);

D3DX8.D3DXSaveSurfaceToFile(PChar(FileName),FileType,pSurface,nil,nil);

pSurface := nil;

g_pD3DDevice := nil;

pD3D := nil;

end;

再给一个直接使用系统GDI实现的抓屏

procedure CaptureScreen(const FileName: string);overload;

var

nScreenWidth,nScreenHeight: integer;

ScreenDc,hCaptureDC: HDC;

bmp: TBitmap;

begin

nScreenWidth := GetSystemMetrics(SM_CXSCREEN);

nScreenHeight := GetSystemMetrics(SM_CYSCREEN);

ScreenDc := GetDC(GetDesktopWindow);

hCaptureDC := CreateCompatibleDC(ScreenDc);

bmp := TBitmap.Create;

bmp.Handle :=CreateCompatibleBitmap(ScreenDc,nScreenWidth, nScreenHeight);

SelectObject(hCaptureDC,bmp.Handle);

BitBlt(hCaptureDC,0,0,nScreenWidth,nScreenHeight,ScreenDc,0,0,SRCCOPY);

bmp.SaveToFile(fileName);

ReleaseDC(GetDesktopWindow,ScreenDc);

DeleteDC(hCaptureDC);

bmp.Free;

end;

通过上面这一步,我们可以很容易联想到用来抓取任何一个控件的表面图象,函数如下:

procedure CaptureControl(Control: TWinControl;const FileName: string);overload;

var

ControlWidth,ControlHeight: integer;

ControlDc,hCaptureDC: HDC;

bmp: TBitmap;

begin

ControlWidth := Control.ClientWidth;

ControlHeight := Control.ClientHeight;

ControlDc := GetDC(Control.Handle);

hCaptureDC := CreateCompatibleDC(ControlDc);

bmp := TBitmap.Create;

bmp.Handle :=CreateCompatibleBitmap(ControlDc,ControlWidth,ControlHeight);

SelectObject(hCaptureDC,bmp.Handle);

BitBlt(hCaptureDC,0,0,ControlWidth,ControlHeight,ControlDc,0,0,SRCCOPY);

bmp.SaveToFile(fileName);

ReleaseDC(GetDesktopWindow,ControlDc);

DeleteDC(hCaptureDC);

bmp.Free;

end;

java截屏有哪几种方法

前台方式

1. 利用html2canvas实现前台截屏

html2canvas项目的gitHub地址

html2canvas示例

html2canvas可以将HTML代码块进行截取,并生成快照形式的canvas,然后可以利用html5的下载功能提供图片的下载接口,供用户下载。

优点:前台技术,实现比较容易。

缺点:此项目使用了html5的技术,因此在对IE的兼容上,只可以在IE9+的版本上使用。

使用时,需要引用jQuery.js和html2canvas.js。(html2canvas.js可以在github上下载)

具体JavaScript代码如下:

var canvas = function () {

html2canvas($("#chart"), {

onrendered: function (canvas) {

$("#class11").html(canvas);//将id为“class11”部分的代码转换为canvas

var type = 'png';//图片类型为png

var imgData = canvas.toDataURL('png');//将图片转换为png类型的流

var _fixType = function (type) {

type = type.toLowerCase().replace(/jpg/i, 'jpeg'); var r = type.match(/png|jpeg|bmp|gif/)[0]; return 'image/' + r;

}; var saveFile = function (data, filename) {

var save_link = document.createElementNS('', 'a');

save_link.href = data;

save_link.download = filename; var event = document.createEvent('MouseEvents');

event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);

save_link.dispatchEvent(event);

}; //下载时的文件名

var filename = 'baidufe_' + (new Date()).getTime() + '.' + type; // 下载文件

saveFile(imgData, filename);

}

});

后台方式(java)

1. 利用html2image实现

html2image的地址(google)

html2image是可以识别html标签并将html转换成图片的java项目。

优点:后台转换,故对浏览器的版本基本没有要求。

缺点:对样式的识别不是很好,转换出来的图片比较简单,基本没有可以兼容的样式。

使用方式:maven中引用如下依赖:

dependency

groupIdcom.github.xuwei-k/groupId

artifactIdhtml2image/artifactId

version0.1.0/version/dependency12345

2. 利用DJNativeSwing项目实现

纯java代码实现。使用DJNativeSwing这个项目,构建一个swing浏览器,打开网址,之后截取图片。(需要eclipse的swt库支持)

优点:纯java实现。

缺点:需要多线程的支持,只在控制台方式实现过(由于本人对于多线程的掌握较弱,目前没有在spring项目中实现这个方法,求大神指导~~)

3. 利用phantomJs实现

phantomJs的GitHub地址

phantomJs官网

phantom利用的是webKit内核,全面支持web而不需浏览器支持,快速,原生支持各种Web标准。

优点:速度快,使用简单。

缺点:需要在项目的服务器端引用exe文件进行截图,并发性能有待考证。

java 怎么实现网页截图

代码如下

[java]

span style="font-size:18px;"package com.util;

import java.awt.AWTException;

import java.awt.Desktop;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.Rectangle;

import java.awt.Robot;

import java.awt.Toolkit;

import java.awt.event.KeyEvent;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import java.net.URISyntaxException;

import java.net.URL;

import javax.imageio.ImageIO;

public class CutPicture {

public static void main(String[] args) throws Exception,

IOException, URISyntaxException, AWTException {

// 此方法仅适用于JdK1.6及以上版本

Desktop.getDesktop().browse(new URL("").toURI());

Robot robot = new Robot();

robot.delay(10000);

Dimension d = new Dimension(Toolkit.getDefaultToolkit().getScreenSize());

int width = (int) d.getWidth();

int height = (int) d.getHeight();

// 最大化浏览器

robot.keyRelease(KeyEvent.VK_F11);

robot.delay(2000);

Image image = robot.createScreenCapture(new Rectangle(0, 0, width,height));

BufferedImage bi = new BufferedImage(width, height,

BufferedImage.TYPE_INT_RGB);

Graphics g = bi.createGraphics();

g.drawImage(image, 0, 0, width, height, null);

// 保存图片

ImageIO.write(bi, "jpg", new File("c:/open.jpg"));

}

}/span

java 实现截屏!

主要是利用java的几个先有的函数,如Robot这个类的一个方法createScreenCapture一个获得一个任意大小的屏幕图像(在这里是全屏图像),而所谓的截图就是在这个图像上画出一个矩形,再利用上面的方法获得这部分的图像,程序中的cf.setAlwaysOnTop(true)是必需的;看起来是在屏幕上截图,其实只是在一个在一个内镶有桌面背景的JFrame中截图。不知道还有没有其他的好方法~

附上代码:

import java.awt.*;

import java.awt.image.*;

import java.awt.event.*;

import java.io.File;

import javax.imageio.ImageIO;

import javax.swing.*;

public class Camera {

/**

* @param args

*/

public static void main(String[] args) {

CameraJFrame cf=new CameraJFrame();

cf.setAlwaysOnTop(true);

cf.setUndecorated(true);

cf.setVisible(true);

}

}

class CameraJFrame extends JFrame

{

/**

*

*/

private static final long serialVersionUID = 1L;

Dimension di=Toolkit.getDefaultToolkit().getScreenSize();

public CameraJFrame()

{

setSize(di);

getContentPane().add(new CameraJPanel());

}

class CameraJPanel extends JPanel implements MouseListener,MouseMotionListener

{

/**

* flag主要是用来判别状态。

* 文件的格式名是unname+数字编号,格式是png

*/

private static final long serialVersionUID = 1L;

BufferedImage bi,get;

int startx,starty,endx,endy;

int flag=1;

String filename="unname";

String fileformat="png";

int count=1;

public CameraJPanel()

{

try

{

Robot ro=new Robot();

bi=ro.createScreenCapture(new Rectangle(0,0,di.width,di.height));

}

catch(Exception e)

{

e.printStackTrace();

}

addMouseListener(this);

addMouseMotionListener(this);

}

public void paintComponent(Graphics g)

{

g.drawImage(bi,0,0,di.width,di.height,this);

g.setColor(Color.red);

g.drawRect(startx, starty, endx-startx, endy-starty);

}

public void mouseClicked(MouseEvent e) {

// TODO Auto-generated method stub

if(e.getButton()==MouseEvent.BUTTON3)

{

System.exit(0);

}

else if(e.getClickCount()==2)

{

try

{

Robot ro=new Robot();

get=ro.createScreenCapture(new Rectangle(startx,starty,endx-startx,endy-starty));

String name=filename+String.valueOf(count++)+"."+fileformat;

File f=new File(name);

ImageIO.write(get, fileformat, f);

}

catch(Exception ex)

{

ex.printStackTrace();

}

flag=1; //置flag为1,以便重新开始截图。

startx=starty=endx=endy=0;

repaint();

}

}

public void mouseEntered(MouseEvent e) {}

public void mouseExited(MouseEvent e) {}

public void mousePressed(MouseEvent e) {

if(flag==1)

{

startx=e.getX();

starty=e.getY();

}

}

public void mouseReleased(MouseEvent e) {

flag=0;

}

public void mouseDragged(MouseEvent e) {

flag=1;

endx=e.getX();

endy=e.getY();

repaint();

}

public void mouseMoved(MouseEvent e) {}

}

}

java 实现截图并且 保存在本地

import java.awt.AWTException;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.GraphicsDevice;

import java.awt.GraphicsEnvironment;

import java.awt.Rectangle;

import java.awt.Robot;

import java.awt.Toolkit;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.awt.event.MouseMotionAdapter;

import java.awt.image.BufferedImage;

import java.awt.image.RescaleOp;

import java.io.File;

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.Date;

import javax.imageio.ImageIO;

import javax.swing.JFrame;

import javax.swing.filechooser.FileSystemView;

/**

* java截屏

* 运行后将当前屏幕截取,并最大化显示。

* 拖拽鼠标,选择自己需要的部分。

* 按Esc键保存图片到桌面,并退出程序。

* 点击右上角(没有可见的按钮),退出程序,不保存图片。

*

* @author JinCeon

*/

public class SnapshotTest {

public static void main(String[] args) {

// 全屏运行

RectD rd = new RectD();

GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment()

.getDefaultScreenDevice();

gd.setFullScreenWindow(rd);

}

}

class RectD extends JFrame {

private static final long serialVersionUID = 1L;

int orgx, orgy, endx, endy;

Dimension d = Toolkit.getDefaultToolkit().getScreenSize();

BufferedImage image;

BufferedImage tempImage;

BufferedImage saveImage;

Graphics g;

@Override

public void paint(Graphics g) {

RescaleOp ro = new RescaleOp(0.8f, 0, null);

tempImage = ro.filter(image, null);

g.drawImage(tempImage, 0, 0, this);

}

public RectD() {

snapshot();

setVisible(true);

// setSize(d);//最大化窗口

setDefaultCloseOperation(EXIT_ON_CLOSE);

this.addMouseListener(new MouseAdapter() {

public void mousePressed(MouseEvent e) {

orgx = e.getX();

orgy = e.getY();

}

});

this.addMouseMotionListener(new MouseMotionAdapter() {

public void mouseDragged(MouseEvent e) {

endx = e.getX();

endy = e.getY();

g = getGraphics();

g.drawImage(tempImage, 0, 0, RectD.this);

int x = Math.min(orgx, endx);

int y = Math.min(orgy, endy);

int width = Math.abs(endx - orgx)+1;

int height = Math.abs(endy - orgy)+1;

// 加上1,防止width或height为0

g.setColor(Color.BLUE);

g.drawRect(x-1, y-1, width+1, height+1);

//减1,加1都是为了防止图片将矩形框覆盖掉

saveImage = image.getSubimage(x, y, width, height);

g.drawImage(saveImage, x, y, RectD.this);

}

});

this.addKeyListener(new KeyAdapter() {

@Override

public void keyReleased(KeyEvent e) {

// 按Esc键退出

if (e.getKeyCode() == 27) {

saveToFile();

System.exit(0);

}

}

});

}

public void saveToFile() {

SimpleDateFormat sdf = new SimpleDateFormat("yyyymmddHHmmss");

String name = sdf.format(new Date());

File path = FileSystemView.getFileSystemView().getHomeDirectory();

String format = "jpg";

File f = new File(path + File.separator + name + "." + format);

try {

ImageIO.write(saveImage, format, f);

} catch (IOException e) {

e.printStackTrace();

}

}

public void snapshot() {

try {

Robot robot = new Robot();

Dimension d = Toolkit.getDefaultToolkit().getScreenSize();

image = robot.createScreenCapture(new Rectangle(0, 0, d.width,

d.height));

} catch (AWTException e) {

e.printStackTrace();

}

}

}

java截屏如何把鼠标箭头截进去

先把鼠标移动到需要的地方。打开java,使用快捷键Ctrl+Alt+A,这样可以在屏幕上的任何地方截屏,右键选中截图“另存为”,还可以在截屏图片上做一些简单的注释和处理,还可以将鼠标箭头截取进去。

java截图保存的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于截图和草图自动保存、java截图保存的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-30,除非注明,否则均为首码项目网原创文章,转载请注明出处。