ºìÁªLinuxÃÅ»§
Linux°ïÖú

±àдһ¸ö»ùÓÚJava RobotÀàµÄÆÁÄ»²¶»ñ¹¤¾ß

·¢²¼Ê±¼ä:2006-10-10 00:55:47À´Ô´:ºìÁª×÷Õß:hfh08
Java Fun and Games£¨JavaÓéÀÖºÍÓÎÏ·£©ÌṩÁËͨ¹ýJavaµÄRobotÀಶ»ñÖ÷ÆÁÄ»É豸µÄ¹¦ÄÜ£¬²¢ÇÒ¿ÉÒÔ½«Õû¸öÆÁÄ»»òÕßÑ¡¶¨µÄÒ»²¿·Ö±£´æΪjpegÎļþ¡£ÕâƪÎÄÕÂÒÔSwingÓ¦ÓõÄÐÎʽʵÏÖÁËÆÁÄ»²¶»ñ¹¤¾ß¡£

Java Fun and Games£¨JavaÓéÀÖºÍÓÎÏ·£©ÌṩÁËͨ¹ýJavaµÄRobotÀಶ»ñÖ÷ÆÁÄ»É豸µÄ¹¦ÄÜ£¬²¢ÇÒ¿ÉÒÔ½«Õû¸öÆÁÄ»»òÕßÑ¡¶¨µÄÒ»²¿·Ö±£´æΪjpegÎļþ¡£

×¢Ò⣺ÏÖÔÚÄã¿ÉÒÔʹÓÃÔÚÏß¿ª·¢¹¤¾ßDevSquare±àÒëºÍÔËÐÐJava Fun and GamesÖÐÌṩµÄapplet¡£DevSquareÈëÃÅÇëÔĶÁ×ÊÔ´ÖÐÌṩµÄÓû§Ïòµ¼¡£

java.awt.RobotÀàΪÓéÀÖ¹¦ÄÜÌṩÁËһЩÓÐÓõķ½·¨¡£ÆäÖÐÒ»¸ö°üÀ¨Á˽¨Á¢ÆÁÄ»²¶»ñ¹¤¾ßµÄ¹¦ÄÜ¡£Java Fun and Games¸ø³öÁËÒ»¸öʹÓÃRobot²¶»ñÖ÷ÆÁÄ»É豸ÄÚÈݵŤ¾ß¡£

ÕâÒ»²¿·Ö´ÓÎÒÒÔÇ°µÄ¼¸²¿·ÖÖзÖÀë³öÀ´ÁË£¬ÒòΪËü²¢²»ÊǼ¯ÖÐÔÚappletʵÏÖÉÏ¡£ÕâƪÎÄÕÂÒÔSwingÓ¦ÓõÄÐÎʽʵÏÖÁËÆÁÄ»²¶»ñ¹¤¾ß¡£´ÓGUI¹Ûµã½éÉÜÍêÕâ¸öÓ¦ÓÃÖ®ºó£¬ÎÒ½«½âÊÍʵÏֵĹؼü²¿·Ö¡£

°æȨÉùÃ÷£ºÈκλñµÃMatrixÊÚȨµÄÍøÕ¾£¬×ªÔØʱÇëÎñ±Ø±£ÁôÒÔÏÂ×÷ÕßÐÅÏ¢ºÍÁ´½Ó
×÷Õß:Jeff Friesen;mydeman
Ô­ÎÄ:http://www.javaworld.com/javaworld/jw-04-2006/jw-0424-funandgames.html
Matrix:http://www.matrix.org.cn/resource/article/2006-09-15/Java+Robot_f9598e5e-445b-11db-af0b-0f766c077b58.html
¹Ø¼ü×Ö:Java Robot;²¶»ñÆÁÄ»

Ó¦ÓóÌÐòGUI
ÎÒµÄCapture³ÌÐòÌṩÁËÒ»¸öͼÐÎÓû§½çÃ棨GUI£¬Graphic User Interface£©£¬Í¨¹ýËüÄã¿ÉÒÔÑ¡Ôñ²¶»ñͼÏñµÄÒ»²¿·Ö£¬ÐÞ¼ôͼÏñµ½Ñ¡ÔñÄÚÈÝ£¬ÒÔ¼°½«½á¹ûͼÏñ±£´æΪjpegÎļþ¡£Í¼1ÏÔʾÁË°üº¬Ò»¸ö²¶»ñʾÀýµÄCaptureµÄGUI¡£


ͼ 1. ºì°×Ïà¼äµÄÐéÏßËùÐγɵľØÐαíʾÁ˵±Ç°Ñ¡ÖеÄÇøÓò

CaptureµÄGUIÓɲ˵¥À¸ºÍÏÔʾ²¶»ñͼÏñµÄ¿É¹ö¶¯´°¿Ú×é³É¡£Èçͼ1Ëùʾ£¬Ñ¡Ôñ¾ØÐΣ¨Í¨¹ýÍÏקÊó±ê£©±íʾÁ˲¶»ñͼÐεÄÒ»¸ö¾ØÐÎÇøÓò¡£

²Ëµ¥À¸ÌṩÁËFileºÍCapture²Ëµ¥£º
---FileÌṩSave As¡­£¨Áí´æΪ£©ºÍExit£¨Í˳ö£©²Ëµ¥Ï¿ÉÒÔͨ¹ýÎļþÑ¡ÔñÆ÷±£´æµ±Ç°²¶»ñΪһ¸öjpegÎļþ£¬ºÍÍ˳öCapture¡£¾¡¹ÜÄã¿ÉÒÔÖ±½ÓÑ¡ÔñÕâЩ²Ëµ¥Ïµ«ÊÇÄã»á·¢ÏÖʹÓÃËüÃǵĿì½Ý¼üAlt-SºÍAlt-X»á¸ü¼Ó·½±ã¡£
---CaptureÌṩCapture£¨²¶»ñ£©ºÍCrop£¨ÐÞ¼ô£©²Ëµ¥Ï¿ÉÒÔ²¶»ñµ±Ç°Ö÷ÆÁÄ»É豸µÄÄÚÈݺÍÐÞ¼ôÒ»¸öͼÏñΪѡÔñ¾ØÐεÄÄÚÈÝ¡£ºÍFile²Ëµ¥ÏîÒ»Ñù£¬ÕâЩ²Ëµ¥ÏîÒ²ÓÐËüÃÇ×Ô¼ºµÄ·½±ãµÄ¿ì½Ý¼ü£ºCapture£¨Alt-C£©ºÍCrop£¨Alt-K£©¡£

Ó¦ÓÃʵÏÖ

ÓÐÈý¸öÔ´ÎļþÀ´ÃèÊöCaptureµÄGUI£ºCapture.java£¨Æô¶¯Ó¦ÓóÌÐòºÍ¹¹ÔìGUI£©¡¢ImageArea.java£¨ ÃèÊöÁËÒ»¸öÓÃÀ´ÏÔʾ²¶»ñµÄÄÚÈݵÄ×é¼þ£¬ÄãÒ²¿ÉÒÔÔÚÆäÖÐÑ¡Ôñ²¶»ñµÄÒ»²¿·Ö»òÐÞ¼ô²¶»ñµÄÄÚÈÝ£©ºÍImageFileFilter.java£¨ÏÞÖÆÎļþÑ¡ÔñÆ÷µÄÑ¡ÔñÊÇÎļþ¼ÐºÍjpegÎļþ£©¡£ÔÚÕâÒ»²¿·ÖÏÂÃ棬ÎÒ´ÓÕâЩԴÎļþÖÐժ¼ÁËһЩ´úÂëƬ¶ÏÀ´ËµÃ÷CaptureµÄ¹¤×÷¹ý³Ì¡£

»úÆ÷ÈËÆÁÄ»²¶»ñ
ΪÁËʹÓÃRobotÀಶ»ñÆÁÄ»£¬Capture±ØÐëÏÈ´´½¨Ò»¸öRobot¶ÔÏó¡£CaptureÀàµÄpublic static void main(String [] args)·½·¨³¢ÊÔµ÷ÓÃRobotµÄpublic Robot()¹¹Ô캯ÊýÀ´´´½¨Õâ¸ö¶ÔÏó¡£Èç¹û´´½¨³É¹¦£¬¾Í»á·µ»ØÒ»¸öÕë¶ÔÖ÷ÆÁÄ»É豸×ø±êϵµÄRobotÒýÓá£Èç¹ûƽ̨²»Ö§³ÖµÍ¼¶¿ØÖÆ£¨ÔÚûÓÐÆÁÄ»É豸µÄ»·¾³ÕâÊdzÉÁ¢µÄ£©£¬½«»áÅ׳öjava.awt.AWTException¡£Èç¹ûƽ̨²»ÔÊÐí´´½¨Robot¶ÔÏó¾Í»áÅ׳öjava.lang.SecurityException¡£µ«Ô¸Äã²»»áÔÙÓöµ½ÆäËûÒì³£¡£

¼ÙÉèRobot¶ÔÏóÒѱ»´´½¨£¬main()µ÷ÓÃCaptureÀàµÄ¹¹Ô캯Êý´´½¨Ò»¸öGUI¡£×÷ΪGUI´´½¨µÄÒ»²¿·Ö£¬Captureͨ¹ýµ÷ÓÃdimScreenSize = Toolkit.getDefaultToolkit().getScreenSize();»ñµÃÖ÷ÆÁÄ»É豸µÄ³ß´ç¡£ÒòΪÓÃÀ´ÏÔʾÆÁÄ»²¶»ñµÄÄÚÈݵÄRobotµÄpublic BufferedImage createScreenCapture(Rectangle screenRect)·½·¨£¬ÐèÒªÒ»¸öjava.awt.Rectangle²ÎÊý£¬ËùÒÔ¹¹Ô캯Êýͨ¹ýrectScreenSize = new Rectangle(dimScreenSize);½«java.awt.Dimension¶ÔÏóת»»ÎªÒ»¸öRectangle¶ÔÏó¡£µ±Capture²Ëµ¥ÏîµÄ¶¯×÷¼àÌýÆ÷±»µ÷ÓÃʱ£¬ÏÂÃæժ¼µÄCapture.javaƬ¶Ï¾Í»áµ÷ÓÃcreateScreenCapture()¡£// Hide Capture's main window so that it does not appear in
// the screen capture.

setVisible (false);

// Perform the screen capture.

BufferedImage biScreen;
biScreen = robot.createScreenCapture (rectScreenSize);

// Show Capture's main window for continued user interaction.

setVisible (true);

// Update ImageArea component with the new image and adjust
// the scrollbars.

ia.setImage (biScreen);

jsp.getHorizontalScrollBar ().setValue (0);
jsp.getVerticalScrollBar ().setValue (0);

Ä㲻ϣÍûCaptureµÄGUIÕÚסÄãÏëÒª²¶»ñµÄÈκÎÄÚÈÝ¡£Õâ¾ÍÊÇΪʲô´úÂëÖÐÒþ²ØCapture GUIÓÅÏȼ¶¸ßÓÚÍê³É²¶»ñ¡£ÔÚ»ñÈ¡ÁË°üº¬ÆÁÄ»ÏñËØcopyµÄjava.awt.image.BufferedImageºó£¬´úÂëƬ¶ÏÏÔʾ³öGUI£¬²¢ÇÒͨ¹ýͼÏñÇøÓò×é¼þÏÔʾ³öBufferedImageµÄÄÚÈÝ¡£

×ÓͼÏñÑ¡Ôñ
µ±´ÓÒ»¸ö²¶»ñµÄͼÏñÖлñÈ¡×ÓͼÏñʱÐèÒªÒ»¸öÑ¡Ôñ¾ØÐΡ£ImageAreaÀàÌṩ´úÂëÀ´´´½¨¡¢²Ù×÷ºÍ»æÖÆÑ¡Ôñ¾ØÐΡ£ÈçÏÂÃæժ¼µÄImageArea.javaËùʾ£¬Õâ¸öÀàµÄ¹¹Ô캯ÊýÒÔÒ»¸öRectangleʵÀý´´½¨Ñ¡Ôñ¾ØÐΣ¬´´½¨java.awt.BasicStokeºÍjava.awt.GradientPaint¶ÔÏó¶¨ÒåÁ˾ØÐεÄÂÖÀªÍâ¹Û£¨±£³ÖËüÓëµ×²ãͼÏñ·ÖÀ룩£¬×¢²áÊó±êºÍÊó±ê¶¯×÷¼àÌýÆ÷ÈÃÄãÄܹ»²Ù×÷Ñ¡Ôñ¾ØÐΡ£// Create a selection Rectangle. It's better to create o­ne Rectangle
// here than a Rectangle each time paintComponent() is called, to reduce
// unnecessary object creation.

rectSelection = new Rectangle ();

// Define the stroke for drawing selection rectangle outline.

bs = new BasicStroke (5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
0, new float [] { 12, 12 }, 0);

// Define the gradient paint for coloring selection rectangle outline.

gp = new GradientPaint (0.0f, 0.0f, Color.red, 1.0f, 1.0f, Color.white,
true);

// Install a mouse listener that sets things up for a selection drag.

MouseListener ml;
ml = new MouseAdapter ()
{
public void mousePressed (MouseEvent e)
{
// When you start Capture, there is no captured image.
// Therefore, it makes no sense to try and select a sub-image.
// This is the reason for the if (image == null) test.

if (image == null)
return;

destx = srcx = e.getX ();
desty = srcy = e.getY ();

repaint ();
}
};
addMouseListener (ml);

// Install a mouse motion listener to update the selection rectangle
// during drag operations.

MouseMotionListener mml;
mml = new MouseMotionAdapter ()
{
public void mouseDragged (MouseEvent e)
{
// When you start Capture, there is no captured image.
// Therefore, it makes no sense to try and select a
// sub-image. This is the reason for the if (image == null)
// test.

if (image == null)
return;

destx = e.getX ();
desty = e.getY ();

repaint ();
}
};
addMouseMotionListener (mml);

µ±°´ÏÂÊó±êʱ£¬Êó±êʼþ´¦ÀíÆ÷¶ÔÏàͬµÄºáÏòÊó±ê×ø±êÉèÖÃdestxºÍsrcx£¬¶ÔÓÚ×ÝÏòÊó±ê×ø±êÒàÊÇÈç´Ë¡£Ô´±äÁ¿ºÍÄ¿±ê±äÁ¿Í¬Ñù±íʾÄÄЩÏÔʾµÄÑ¡Ôñ¾ØÐÎÓ¦¸Ã±»ÒƳýÁË¡£Ëüͨ¹ýµ÷ÓÃrepaint()£¬µ¼ÖÂpublic void paintComponent(Graphics g)±»µ÷Óá£Õâ¸ö·½·¨½«srcxºÍsrcy·Ö±ðÓëdestxºÍdestyÏà±È½Ï£¬Èç¹ûËûÃDz»Í¬£¬¾Í»æÖÆÒ»¸öÑ¡Ôñ¾ØÐΣº// Draw the selection rectangle if present.

if (srcx != destx || srcy != desty)
{
// Compute upper-left and lower-right coordinates for selection
// rectangle corners.

int x1 = (srcx destx) ? srcx : destx;
int y2 = (srcy > desty) ? srcy : desty;

// Establish selection rectangle origin.

rectSelection.x = x1;
rectSelection.y = y1;

// Establish selection rectangle extents.

rectSelection.width = (x2-x1)+1;
rectSelection.height = (y2-y1)+1;

// Draw selection rectangle.

Graphics2D g2d = (Graphics2D) g;
g2d.setStroke (bs);
g2d.setPaint (gp);
g2d.draw (rectSelection);
}

ÔÚÑ¡Ôñ¾ØÐλæÖÆÒÔÇ°£¬ËüµÄ×óÉϺÍÓÒϽDZØÐë¶Ô±êʾ³öÀ´£¬ÓÃÀ´È·¶¨¾ØÐεÄÔ­µãºÍ·¶Î§¡£ÒÔÖÁÓÚÄã¿ÉÒÔÔÚ²»Í¬µÄ·½ÏòÍÏק³öÑ¡Ôñ¾ØÐΣ¨ÀýÈçÓÒÏ»òÕß×óÉÏ·½Ïò£©£¬srcx/destxºÍsrcy/destyµÄ×îСֵ±íʾ×óÉϽǣ¬ÏàËƵأ¬ËüÃǵÄ×î´óÖµ±íʾÓÒϽǡ£

ͼÏñÐÞ¼ô
ÔÚÑ¡Ôñ×ÓͼÏñºó£¬ÄãÏëÒªÐÞ¼ô²¶»ñµÄͼÏñµÃµ½×ÓͼÏñ¡£Í¼ÏñÐÞ¼ôÆô¶¯CropÖеIJ˵¥ÏîµÄ¶¯×÷¼àÌýÆ÷£¬ËüÇëÇóImageArea½«²¶»ñµÄͼÏñÐÞ¼ôΪѡÔñµÄ×ÓͼÏñ¡£Èô²Ù×÷³É¹û£¬¼àÌýÆ÷ÔòÖØÖÃImageAreaµÄ¹ö¶¯Ìõ¡£·´Ö®£¬¼àÌýÆ÷ͨ¹ý¶Ô»°¿ò¸ø³öÒ»¸ö¡°Out of bounds¡±´íÎóÐÅÏ¢¡£// Crop ImageArea component and adjust the scrollbars if
// cropping succeeds.

if (ia.crop ())
{
jsp.getHorizontalScrollBar ().setValue (0);
jsp.getVerticalScrollBar ().setValue (0);
}
else
showError ("Out of bounds.");

ÒòΪÐÞ¼ô²Ù×÷²»ÖØÖÃCapture GUIµÄ´óС£¬ËùÒÔ¿ÉÒÔͬʱ¿´µ½Ö÷´°¿ÚµÄ±³¾°ºÍ½á¹ûͼÏñ£¨³õʼÐÞ¼ôºóµÄ£©¡£Í¼2ÏÔʾÁËÑ¡ÔñͼÏñµÄÒ»²¿·Öʱ»¹¿ÉÄÜÑ¡Öб³¾°µÄÒ»²¿·Ö¡£


ͼ 2. ³¢ÊÔÑ¡Ôñ¶àÓÚÕâ¸öͼÏñ

Ö÷´°¿ÚµÄ±³¾°ÏñËز»ÊDz¶»ñµÄͼÏñµÄÒ»²¿·Ö£»¾Í²»¿ÉÄÜ°ÑËüÃÇ°üº¬ÔÚÐÞ¼ôµÄͼƬÄÚ¡£Òò´Ë£¬ÎÞÂÛºÎʱ°Ñ±³¾°ÏñËØ°üº¬ÔÚÐÞ¼ôÇøÓòÄÚ£¬²Ù×÷¶¼»áʧ°Ü£¬²¢ÇÒ»á¸ø³öÒ»¸ö¡°Out of bounds¡±´íÎóÐÅÏ¢¡£

ÐÞ¼ô²Ù×÷ÓÉImageAreaµÄpublic Boolean crop()·½·¨´¦Àí¡£Èç¹ûÍê³ÉÁËÐÞ¼ô»òÕßûÓÐÑ¡Ôñ×ÓͼÏñ£¨µ±Ã»ÓÐÑ¡ÖÐÄÚÈÝʱµ÷ÓÃÕâ¸ö·½·¨ÊǷdz£·½±ãµÄ£©¸Ã·½·¨£¨ÈçÏÂËùʾ£©·µ»Øtrue¡£Èç¹ûÔÚÑ¡ÔñÇøÓòÖаüº¬Á˱³¾°ÏñËØÔò·µ»Øfalse¡£public boolean crop ()
{
// There is nothing to crop if the selection rectangle is o­nly a single
// point.

if (srcx == destx && srcy == desty)
return true;

// Assume success.

boolean succeeded = true;

// Compute upper-left and lower-right coordinates for selection rectangle
// corners.

int x1 = (srcx destx) ? srcx : destx;
int y2 = (srcy > desty) ? srcy : desty;

// Compute width and height of selection rectangle.

int width = (x2-x1)+1;
int height = (y2-y1)+1;

// Create a buffer to hold cropped image.

BufferedImage biCrop = new BufferedImage (width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = biCrop.createGraphics ();

// Perform the crop operation.

try
{
BufferedImage bi = (BufferedImage) image;
BufferedImage bi2 = bi.getSubimage (x1, y1, width, height);
g2d.drawImage (bi2, null, 0, 0);
}
catch (RasterFormatException e)
{
succeeded = false;
}

g2d.dispose ();

if (succeeded)
setImage (biCrop); // Implicitly remove selection rectangle.
else
{
// Prepare to remove selection rectangle.

srcx = destx;
srcy = desty;

// Explicitly remove selection rectangle.

repaint ();
}

return succeeded;
}

crop()·½·¨µ÷ÓÃBufferedImageµÄpublic BufferedImage getSubimage(int x, int y, int w, int h)·½·¨ÕªÈ¡Ñ¡ÔñÇøÓòÄÚµÄ×ÓͼÏñ¡£Èç¹û¸Ã·½·¨µÄ²ÎÊýûÓÐÖ¸¶¨BufferedImageÄÚµÄͼÏñ£¬Ëü¾Í»áÅ׳öÒ»¸öjava.awt.image.RasterFormatException£¬Òò´Ë¾Í»á·µ»Øfalse¡£

ͼÏñ±£´æ
CaptureÔÊÐíÄã°Ñ²¶»ñµÄͼÏñ±£´æΪһ¸öjpegÎļþ¡£Äãͨ¹ýÒ»¸ö±£´æÎļþÑ¡ÔñÆ÷Ö¸¶¨ÎļþÃû£¬Ñ¡ÔñÆ÷ÓÉCaptureÀàµÄ¹¹Ô캯Êý´´½¨£º// Construct a save file-chooser. Initialize the starting directory to
// the current directory, do not allow the user to select the "all files"
// filter, and restrict the files that can be selected to those ending
// with .jpg or .jpeg extensions.

final JFileChooser fcSave = new JFileChooser ();
fcSave.setCurrentDirectory (new File (System.getProperty ("user.dir")));
fcSave.setAcceptAllFileFilterUsed (false);
fcSave.setFileFilter (new ImageFileFilter ());

ΪÁËÏÞÖÆÎļþÑ¡ÔñÆ÷µÄÑ¡ÔñÊÇÎļþ¼Ð»òÕßÊÇÒÔ.jpg»ò.jpegΪºó׺µÄÎļþ£¬¾ÍʹÓÃÁËImageFileFilterÀàµÄÒ»¸öʵÀý×÷Ϊ±£´æʱÎļþÑ¡ÔñÆ÷µÄÎļþ¹ýÂËÆ÷¡£¸Ã·½·¨¶ÔÓÚÈκηÇÎļþ¼ÐºÍºó׺Ãû·Ç.jpg/.jpegµÄÎļþ¶¼·µ»Øfalse£ºpublic boolean accept (File f)
{
// Allow the user to select directories so that the user can navigate the
// file system.

if (f.isDirectory ())
return true;

// Allow the user to select files ending with a .jpg or a .jpeg
// extension.

String s = f.getName ();
int i = s.lastIndexOf ('.');

if (i > 0 && i

µ±ÄãÑ¡ÔñÁËSave As¡­²Ëµ¥Ïîʱ£¬ËüµÄ¼àÌýÆ÷¾Í»áÏÔʾһ¸ö±£´æÎļþÑ¡ÔñÆ÷¡£¼Ù¶¨ÄãûÓÐÍ˳öÑ¡ÔñÆ÷£¬¼àÌýÆ÷¾Í»áÈ·±£ÄãÑ¡ÔñµÄÎļþÃûÊÇÒÔ.jpg»ò.jpegΪºó׺Ãû¡£¼ÌÐø£¬¼àÌýÆ÷»áÈ·¶¨ÎļþÊÇ·ñ´æÔÚ£¬ÕâÑùÄã¾Í²»»áÎÞÒâÖи²¸ÇÒ»¸ö´æÔÚµÄÎļþ¡£// Present the "save" file-chooser without any file selected.
// If the user cancels this file-chooser, exit this method.

fcSave.setSelectedFile (null);
if (fcSave.showSaveDialog (Capture.this) !=
JFileChooser.APPROVE_OPTION)
return;

// Obtain the selected file. Validate its extension, which
// must be .jpg or .jpeg. If extension not present, append
// .jpg extension.

File file = fcSave.getSelectedFile ();
String path = file.getAbsolutePath ().toLowerCase ();
if (!path.endsWith (".jpg") && !path.endsWith (".jpeg"))
file = new File (path += ".jpg");

// If the file exists, inform the user, who might not want
// to accidentally overwrite an existing file. Exit method
// if the user specifies that it is not okay to overwrite
// the file.

if (file.exists ())
{
int choice = JOptionPane.
showConfirmDialog (null,
"Overwrite file?",
"Capture",
JOptionPane.
YES_NO_OPTION);
if (choice == JOptionPane.NO_OPTION)
return;
}

Èç¹ûÎļþ²»´æÔÚ»òÕßÄãÔÊÐí¸²¸ÇÒѾ­´æÔÚµÄÎļþ£¬¼àÌýÆ÷¾Í»á½«²¶»ñµÄÄÚÈݱ£´æΪһ¸öÑ¡ÔñµÄÎļþ¡£ÎªÁËÍê³ÉÕâ¸öÈÎÎñ£¬¼àÌýÆ÷ʹÓÃJavaµÄImageIO¿ò¼ÜÑ¡ÔñÒ»¸öjpeg writer£¬Ö¸¶¨Îļþ×÷ΪwriterµÄÄ¿±ê£¬ÉèÖÃwriterµÄѹËõÆ·ÖÊΪ95%£¬È»ºó°ÑͼÏñдÈëµ½ÎļþÖС£ImageWriter writer = null;
ImageOutputStream ios = null;

try
{
// Obtain a writer based o­n the jpeg format.

Iterator iter;
iter = ImageIO.getImageWritersByFormatName ("jpeg");

// Validate existence of writer.

if (!iter.hasNext ())
{
showError ("Unable to save image to jpeg file type.");
return;
}

// Extract writer.

writer = (ImageWriter) iter.next();

// Configure writer output destination.

ios = ImageIO.createImageOutputStream (file);
writer.setOutput (ios);

// Set jpeg compression quality to 95%.

ImageWriteParam iwp = writer.getDefaultWriteParam ();
iwp.setCompressionMode (ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality (0.95f);

// Write the image.

writer.write (null,
new IIOImage ((BufferedImage)
ia.getImage (), null, null),
iwp);
}
catch (IOException e2)
{
showError (e2.getMessage ());
}
finally
{
try
{
// Cleanup.

if (ios != null)
{
ios.flush ();
ios.close ();
}

if (writer != null)
writer.dispose ();
}
catch (IOException e2)
{
}
}

ÈôúÂë×Ô¼ºÇåÀíÒ»Ö±ÊÇÒ»¸ö²»´íµÄÖ÷Òâ¡£ÎÒ°ÑImageIOµÄÇåÀí´úÂë·ÅÔÚÁËfinally×Ó¾äÖУ¬ÒÔÖÁÓÚÎÞÂÛÊÇÕý³£½áÊø»¹ÊÇÅ׳öÒì³££¬Ëü¶¼¿ÉÒÔÖ´ÐС£

×ܽá

CaptureÏÞÖÆÁ˲¶»ñµÄÄÚÈÝÖ»ÄÜÔÚÖ÷ÆÁÄ»É豸ÄÚ¡£Äã¿ÉÄÜÏëÔöÇ¿CaptureÀ´²¶»ñËùÓи½¼ÓÆÁÄ»É豸£¨»òÐíÊÇÒ»¸ö¾Þ´óµÄÐéÄâÆÁÄ»£©µÄÄÚÈÝ¡£ÔöÇ¿Ö®Ò»£¬ÄãÐèÒª°üº¬ÏÂÃæµÄ´úÂ룬Ëü²¶»ñËùÓÐÆÁÄ»µÄÄÚÈÝ£¬½«ËüºÍCapture.javaÒѾ­´æÔڵĴúÂ뼯³É¡£GraphicsEnvironment graphenv = GraphicsEnvironment.getLocalGraphicsEnvironment ();
GraphicsDevice [] screens = graphenv.getScreenDevices ();
BufferedImage [] captures = new BufferedImage [screens.length];

for (int i = 0; i

°ÑÒÔÉÏ´úÂë·Åµ½Capture²Ëµ¥ÏîµÄ¶¯×÷¼àÌýÆ÷ÄÚ¡£È»ºóÏÈÒýÈë´úÂë´´½¨Ò»¸öbigScreenÒªÒýÓõÄ×ã¹»´óµÄBufferedImage£¬Ëü¿ÉÒÔ±£´æ±»capturesÊý×éÒýÓõÄËùÓÐBufferedImageÄÚÈÝ£»½Ó×ÅÒýÈë´úÂë°ÑËüÃǵĻæÖƵ½bigScreenÖС£CaptureÏÖÔÚ³ÉΪÁ˶àÆÁÄ»²¶»ñÆ÷¾ÍºÃÏñÊÇÒ»¸öµ¥ÆÁÄ»²¶»ñÆ÷¡£

¹ØÓÚ×÷Õß
Jeff FriesenÊÇÒ»¸ö×ÔÓÉÈí¼þ¿ª·¢ÕߺͽÌÓý¼Ò£¬ÌرðÊÇÔÚC¡¢C++ºÍJava¼¼ÊõÁìÓò
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ