জাভা ব্যবহার করে স্ক্রিনশট নেওয়ার এবং এটিকে কোনও ধরণের চিত্রে সংরক্ষণ করার কোনও উপায় আছে কি?


128

শিরোনাম অনুসারে সহজ: আপনি কী স্ক্রিনশট নিতে এবং এটি সংরক্ষণ করতে জাভা কমান্ড ব্যবহার করতে পারেন? অথবা, স্ক্রিনশটটি নেওয়ার জন্য এবং পরে এটি ক্লিপবোর্ড থেকে দখল করার জন্য আমার কোনও ওএস নির্দিষ্ট প্রোগ্রাম ব্যবহার করা দরকার?



আমি জানতাম না এত সহজ হবে।
jjnguy

2
এই প্রশ্নের জন্য ধন্যবাদ, আমি আমার ব্লগে নিখুঁত নতুনদের জন্য একটি টিউটোরিয়াল লিখেছি: thepcwizard.in/2012/12/java-screen-capturing-tutorial.html
ThePCWizard

উত্তর:


187

বিশ্বাস করুন বা না করুন, আপনি আসলে java.awt.Robot"স্ক্রিন থেকে পিক্সেল যুক্ত একটি চিত্র তৈরি করতে" ব্যবহার করতে পারেন । তারপরে আপনি সেই চিত্রটি ডিস্কের কোনও ফাইলে লিখতে পারেন।

আমি কেবল এটি চেষ্টা করে দেখেছি এবং পুরো জিনিসটি এখানে শেষ হয়:

Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
BufferedImage capture = new Robot().createScreenCapture(screenRect);
ImageIO.write(capture, "bmp", new File(args[0]));

দ্রষ্টব্য: এটি কেবলমাত্র প্রাথমিক মনিটরকে ক্যাপচার করবে। মাল্টি-মনিটরের সহায়তার জন্য গ্রাফিকস কনফিগারেশন দেখুন ।


1
আমি অবাক হয়েছি যে এটিই যদি এলুমিনেট ( ইলুমিনেট ডট কম ) এর মতো স্ক্রিন ভাগ করে নেওয়ার অ্যাপ্লিকেশনগুলি ব্যবহার করে।
ক্রিস ওয়াগনার

@ জাভা_েন্থু আসলে হ্যাঁ, আপনি যদি আপনার অ্যাপ্লিকেশনটিতে স্ক্রিনশটের জন্য হার্ডকোড করে থাকেন তবে কনসোল ছাড়াই এটি কাজ করবে।
দিমিত্রি জাগোরুলকিন

2
স্ক্রিন ক্যাপচারে রোবট মাউসকে অন্তর্ভুক্ত করে না। একই কাজ করে যা একই কাজ করে, তবে মাউসকে অন্তর্ভুক্ত করে?
নাল ইউজার

3
মাউস কার্সার ক্যাপচার করারও কি উপায় আছে ?!
মেহেদী কারামোসলি 20'13

23

আমি কখনই রোবট ব্যবহার করতে পছন্দ করি না, তাই জেফ্রেমে অবজেক্টগুলির স্ক্রিনশট তৈরির জন্য আমি আমার নিজস্ব সহজ পদ্ধতি তৈরি করেছি:

public static final void makeScreenshot(JFrame argFrame) {
    Rectangle rec = argFrame.getBounds();
    BufferedImage bufferedImage = new BufferedImage(rec.width, rec.height, BufferedImage.TYPE_INT_ARGB);
    argFrame.paint(bufferedImage.getGraphics());

    try {
        // Create temp file
        File temp = File.createTempFile("screenshot", ".png");

        // Use the ImageIO API to write the bufferedImage to a temporary file
        ImageIO.write(bufferedImage, "png", temp);

        // Delete temp file when program exits
        temp.deleteOnExit();
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
}

17
আপনি রোবটকে কেন পছন্দ করছেন না তার কোনও কারণ?
সাইমন ফোর্সবার্গ

2
এটিকে স্বাদ হিসাবে বিবেচনা করুন।
দেজনলিক

3
দেখে মনে হচ্ছে স্ক্রিনশটটি নেওয়ার আগে লক্ষ্য উইন্ডোটি অস্পষ্ট করা হলেও এটির কাজের সুবিধা থাকা উচিত।
ব্র্যাড ম্যাস 14

7
অন্যদিকে, এটি কেবল উইন্ডোটির বিষয়বস্তু পায়, তবে Robotআপনি উইন্ডোর ফ্রেম এবং শিরোনামবারটিও পেতে পারেন।
ব্র্যাড ম্যাস 15

1
হাইডিপিআইয়ের জন্য (ম্যাক রেটিনা) এটি অর্ধ রেজোলিউশনে স্ক্রিনশট তৈরি করে। আরগফ্রেম.পেইন্ট (বাফারডিম্যাজ.জেটগ্রাফিক্স ()) কল করার আগে নতুন বাফারডিম্যাজ (rec.width * 2, rec.height * 2, বাফারডেমেজ.টিওয়াইপিন আইআইএনবিআরজিবি) এর জন্য সেই বাফার্ডআইজেজ.জেটগ্রাফিকস ()। স্কেল (2, 2) ঠিক করতে to
বাফার্ডআইমেজ

18

আপনি যদি সমস্ত মনিটর ক্যাপচার করতে চান তবে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] screens = ge.getScreenDevices();

Rectangle allScreenBounds = new Rectangle();
for (GraphicsDevice screen : screens) {
    Rectangle screenBounds = screen.getDefaultConfiguration().getBounds();

    allScreenBounds.width += screenBounds.width;
    allScreenBounds.height = Math.max(allScreenBounds.height, screenBounds.height);
}

Robot robot = new Robot();
BufferedImage screenShot = robot.createScreenCapture(allScreenBounds);


10
public void captureScreen(String fileName) throws Exception {
   Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
   Rectangle screenRectangle = new Rectangle(screenSize);
   Robot robot = new Robot();
   BufferedImage image = robot.createScreenCapture(screenRectangle);
   ImageIO.write(image, "png", new File(fileName));
}

3
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File; 
import javax.imageio.ImageIO;
import javax.swing.*;  

public class HelloWorldFrame extends JFrame implements ActionListener {

JButton b;
public HelloWorldFrame() {
    this.setVisible(true);
    this.setLayout(null);
    b = new JButton("Click Here");
    b.setBounds(380, 290, 120, 60);
    b.setBackground(Color.red);
    b.setVisible(true);
    b.addActionListener(this);
    add(b);
    setSize(1000, 700);
}
public void actionPerformed(ActionEvent e)
{
    if (e.getSource() == b) 
    {
        this.dispose();
        try {
            Thread.sleep(1000);
            Toolkit tk = Toolkit.getDefaultToolkit(); 
            Dimension d = tk.getScreenSize();
            Rectangle rec = new Rectangle(0, 0, d.width, d.height);  
            Robot ro = new Robot();
            BufferedImage img = ro.createScreenCapture(rec);
            File f = new File("myimage.jpg");//set appropriate path
            ImageIO.write(img, "jpg", f);
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
}

public static void main(String[] args) {
    HelloWorldFrame obj = new HelloWorldFrame();
}
}

আমি একটি বেঞ্চমার্ক করেছি এবং এটি একটি সবচেয়ে ধীরতম আকারেও রয়েছে, এতে সবচেয়ে বেশি ক্ষতি এবং বৃহত্তম ফাইল আকারও রয়েছে। দুঃখিত,
লিয়াম লারসেন

3
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();  
GraphicsDevice[] screens = ge.getScreenDevices();       
Rectangle allScreenBounds = new Rectangle();  
for (GraphicsDevice screen : screens) {  
       Rectangle screenBounds = screen.getDefaultConfiguration().getBounds();        
       allScreenBounds.width += screenBounds.width;  
       allScreenBounds.height = Math.max(allScreenBounds.height, screenBounds.height);
       allScreenBounds.x=Math.min(allScreenBounds.x, screenBounds.x);
       allScreenBounds.y=Math.min(allScreenBounds.y, screenBounds.y);
      } 
Robot robot = new Robot();
BufferedImage bufferedImage = robot.createScreenCapture(allScreenBounds);
File file = new File("C:\\Users\\Joe\\Desktop\\scr.png");
if(!file.exists())
    file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
ImageIO.write( bufferedImage, "png", fos );

বাফার্ডআইমেজটিতে একটি পূর্ণ স্ক্রিনশট থাকবে, এটি তিনটি মনিটরের সাথে পরীক্ষা করা হয়েছিল


0

আপনি java.awt.Robotএই কাজটি অর্জন করতে ব্যবহার করতে পারেন ।

নীচে সার্ভারের কোডটি দেওয়া হয়েছে, যা ক্রেস্ট করা স্ক্রিনশটটি আপনার ডিরেক্টরিতে চিত্র হিসাবে সংরক্ষণ করে।

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.imageio.ImageIO;

public class ServerApp extends Thread
{
       private ServerSocket serverSocket=null;
       private static Socket server = null;
       private Date date = null;
       private static final String DIR_NAME = "screenshots";

   public ServerApp() throws IOException, ClassNotFoundException, Exception{
       serverSocket = new ServerSocket(61000);
       serverSocket.setSoTimeout(180000);
   }

public void run()
   {
       while(true)
      {
           try
           {
              server = serverSocket.accept();
              date = new Date();
                  DateFormat dateFormat = new SimpleDateFormat("_yyMMdd_HHmmss");
              String fileName = server.getInetAddress().getHostName().replace(".", "-");
              System.out.println(fileName);
              BufferedImage img=ImageIO.read(ImageIO.createImageInputStream(server.getInputStream()));
              ImageIO.write(img, "png", new File("D:\\screenshots\\"+fileName+dateFormat.format(date)+".png"));
              System.out.println("Image received!!!!");
              //lblimg.setIcon(img);
          }
         catch(SocketTimeoutException st)
         {
               System.out.println("Socket timed out!"+st.toString());
 //createLogFile("[stocktimeoutexception]"+stExp.getMessage());
                  break;
             }
             catch(IOException e)
             {
                  e.printStackTrace();
                  break;
         }
         catch(Exception ex)
        {
              System.out.println(ex);
        }
      }
   }

   public static void main(String [] args) throws IOException, SQLException, ClassNotFoundException, Exception{
          ServerApp serverApp = new ServerApp();
          serverApp.createDirectory(DIR_NAME);
          Thread thread = new Thread(serverApp);
            thread.start();
   }

private void createDirectory(String dirName) {
    File newDir = new File("D:\\"+dirName);
    if(!newDir.exists()){
        boolean isCreated = newDir.mkdir();
    }
 }
} 

এবং এটি ক্লায়েন্ট কোড যা থ্রেডে চলছে এবং কয়েক মিনিটের পরে এটি ব্যবহারকারীর স্ক্রিনের স্ক্রিনশটটি ক্যাপচার করছে।

package com.viremp.client;

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.Socket;
import java.util.Random;

import javax.imageio.ImageIO;

public class ClientApp implements Runnable {
    private static long nextTime = 0;
    private static ClientApp clientApp = null;
    private String serverName = "192.168.100.18"; //loop back ip
    private int portNo = 61000;
    //private Socket serverSocket = null;

    /**
     * @param args
     * @throws InterruptedException 
     */
    public static void main(String[] args) throws InterruptedException {
        clientApp = new ClientApp();
        clientApp.getNextFreq();
        Thread thread = new Thread(clientApp);
        thread.start();
    }

    private void getNextFreq() {
        long currentTime = System.currentTimeMillis();
        Random random = new Random();
        long value = random.nextInt(180000); //1800000
        nextTime = currentTime + value;
        //return currentTime+value;
    }

    @Override
    public void run() {
        while(true){
            if(nextTime < System.currentTimeMillis()){
                System.out.println(" get screen shot ");
                try {
                    clientApp.sendScreen();
                    clientApp.getNextFreq();
                } catch (AWTException e) {
                    // TODO Auto-generated catch block
                    System.out.println(" err"+e);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch(Exception e){
                    e.printStackTrace();
                }

            }
            //System.out.println(" statrted ....");
        }

    }

    private void sendScreen()throws AWTException, IOException {
           Socket serverSocket = new Socket(serverName, portNo);
             Toolkit toolkit = Toolkit.getDefaultToolkit();
             Dimension dimensions = toolkit.getScreenSize();
                 Robot robot = new Robot();  // Robot class 
                 BufferedImage screenshot = robot.createScreenCapture(new Rectangle(dimensions));
                 ImageIO.write(screenshot,"png",serverSocket.getOutputStream());
                 serverSocket.close();
    }
}

0

টুলকিট পিপিআই ভিত্তিক পিক্সেল দেয়, ফলস্বরূপ, উইন্ডোজে পিপিআই> 100% ব্যবহার করার সময় পুরো স্ক্রিনের জন্য একটি স্ক্রিনশট তৈরি হয় না। আমি এটি করার প্রস্তাব দিচ্ছি:

DisplayMode displayMode = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getDisplayMode();
Rectangle screenRectangle = new Rectangle(displayMode.getWidth(), displayMode.getHeight());
BufferedImage screenShot = new Robot().createScreenCapture(screenRectangle);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.