Tuesday, July 22, 2025

Java Camera


# Java Swing Application for Image/Video Capture from Camera or Android Device

Here's a complete Java Swing application that can:
1. Load images from camera/monitor/Android device
2. Capture single images
3. Record video with pause/stop functionality
4. Save files to target location

```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.imageio.ImageIO;

public class CameraCaptureApp extends JFrame {
    private JLabel imageLabel;
    private AtomicBoolean recording = new AtomicBoolean(false);
    private AtomicBoolean paused = new AtomicBoolean(false);
    private File outputFile;
    private Timer captureTimer;
    private BufferedImage currentImage;
    private VideoRecorder videoRecorder;

    public CameraCaptureApp() {
        setTitle("Camera Capture Application");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        
        // Image display area
        imageLabel = new JLabel("No image available", SwingConstants.CENTER);
        imageLabel.setPreferredSize(new Dimension(640, 480));
        add(imageLabel, BorderLayout.CENTER);
        
        // Control buttons
        JPanel controlPanel = new JPanel();
        
        JButton loadImageBtn = new JButton("Load Image");
        JButton captureBtn = new JButton("Capture Image");
        JButton startRecordBtn = new JButton("Start Recording");
        JButton pauseRecordBtn = new JButton("Pause Recording");
        JButton stopRecordBtn = new JButton("Stop Recording");
        JButton saveImageBtn = new JButton("Save Image");
        
        // Button actions
        loadImageBtn.addActionListener(e -> loadImage());
        captureBtn.addActionListener(e -> captureImage());
        startRecordBtn.addActionListener(e -> startRecording());
        pauseRecordBtn.addActionListener(e -> pauseRecording());
        stopRecordBtn.addActionListener(e -> stopRecording());
        saveImageBtn.addActionListener(e -> saveImage());
        
        // Add buttons to panel
        controlPanel.add(loadImageBtn);
        controlPanel.add(captureBtn);
        controlPanel.add(startRecordBtn);
        controlPanel.add(pauseRecordBtn);
        controlPanel.add(stopRecordBtn);
        controlPanel.add(saveImageBtn);
        
        add(controlPanel, BorderLayout.SOUTH);
        
        // Initialize video recorder
        videoRecorder = new VideoRecorder();
        
        pack();
        setLocationRelativeTo(null);
    }
    
    private void loadImage() {
        // For Android device connection, you would need additional setup
        // This is a simplified version that loads from file
        
        JFileChooser fileChooser = new JFileChooser();
        int returnValue = fileChooser.showOpenDialog(this);
        
        if (returnValue == JFileChooser.APPROVE_OPTION) {
            File selectedFile = fileChooser.getSelectedFile();
            try {
                BufferedImage img = ImageIO.read(selectedFile);
                displayImage(img);
            } catch (IOException e) {
                JOptionPane.showMessageDialog(this, "Error loading image: " + e.getMessage());
            }
        }
    }
    
    private void captureImage() {
        // This would capture from camera - simplified version
        // In real app, you would use JavaCV or other camera API
        
        try {
            // Simulate camera capture with a blank image
            BufferedImage capturedImage = new BufferedImage(640, 480, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = capturedImage.createGraphics();
            g2d.setColor(Color.WHITE);
            g2d.fillRect(0, 0, 640, 480);
            g2d.setColor(Color.RED);
            g2d.drawString("Camera Capture Simulation", 50, 50);
            g2d.dispose();
            
            displayImage(capturedImage);
            currentImage = capturedImage;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Error capturing image: " + e.getMessage());
        }
    }
    
    private void startRecording() {
        if (!recording.get()) {
            JFileChooser fileChooser = new JFileChooser();
            fileChooser.setDialogTitle("Specify video output file");
            
            if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
                outputFile = fileChooser.getSelectedFile();
                if (!outputFile.getName().toLowerCase().endsWith(".avi")) {
                    outputFile = new File(outputFile.getAbsolutePath() + ".avi");
                }
                
                recording.set(true);
                paused.set(false);
                
                // Start video recording
                videoRecorder.startRecording(outputFile);
                
                // Start capture timer (simulating video frames)
                captureTimer = new Timer(1000/30, e -> {
                    if (recording.get() && !paused.get()) {
                        BufferedImage frame = getCurrentFrame();
                        videoRecorder.addFrame(frame);
                    }
                });
                captureTimer.start();
                
                JOptionPane.showMessageDialog(this, "Recording started to: " + outputFile.getAbsolutePath());
            }
        }
    }
    
    private void pauseRecording() {
        if (recording.get()) {
            paused.set(!paused.get());
            JOptionPane.showMessageDialog(this, paused.get() ? "Recording paused" : "Recording resumed");
        }
    }
    
    private void stopRecording() {
        if (recording.get()) {
            recording.set(false);
            paused.set(false);
            captureTimer.stop();
            videoRecorder.stopRecording();
            JOptionPane.showMessageDialog(this, "Recording stopped. Saved to: " + outputFile.getAbsolutePath());
        }
    }
    
    private void saveImage() {
        if (currentImage != null) {
            JFileChooser fileChooser = new JFileChooser();
            fileChooser.setDialogTitle("Save Image");
            
            if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
                File fileToSave = fileChooser.getSelectedFile();
                if (!fileToSave.getName().toLowerCase().endsWith(".png")) {
                    fileToSave = new File(fileToSave.getAbsolutePath() + ".png");
                }
                
                try {
                    ImageIO.write(currentImage, "PNG", fileToSave);
                    JOptionPane.showMessageDialog(this, "Image saved to: " + fileToSave.getAbsolutePath());
                } catch (IOException e) {
                    JOptionPane.showMessageDialog(this, "Error saving image: " + e.getMessage());
                }
            }
        } else {
            JOptionPane.showMessageDialog(this, "No image to save!");
        }
    }
    
    private void displayImage(BufferedImage image) {
        ImageIcon icon = new ImageIcon(image.getScaledInstance(
            imageLabel.getWidth(), imageLabel.getHeight(), Image.SCALE_SMOOTH));
        imageLabel.setIcon(icon);
        currentImage = image;
    }
    
    private BufferedImage getCurrentFrame() {
        // In real app, this would get frame from camera
        // Here we're just simulating with a timestamped image
        
        BufferedImage frame = new BufferedImage(640, 480, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = frame.createGraphics();
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, 640, 480);
        g2d.setColor(Color.BLUE);
        g2d.drawString("Frame at: " + System.currentTimeMillis(), 50, 50);
        g2d.dispose();
        return frame;
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            CameraCaptureApp app = new CameraCaptureApp();
            app.setSize(800, 600);
            app.setVisible(true);
        });
    }
    
    // Inner class for video recording functionality
    class VideoRecorder {
        private FileOutputStream fos;
        private DataOutputStream dos;
        
        public void startRecording(File file) {
            try {
                fos = new FileOutputStream(file);
                dos = new DataOutputStream(fos);
                // Write header (simplified - real app would use proper video format)
                dos.writeUTF("VIDEO_START");
            } catch (IOException e) {
                JOptionPane.showMessageDialog(CameraCaptureApp.this, 
                    "Error starting recording: " + e.getMessage());
            }
        }
        
        public void addFrame(BufferedImage frame) {
            if (dos != null) {
                try {
                    // Convert image to bytes (simplified)
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    ImageIO.write(frame, "jpg", baos);
                    byte[] frameData = baos.toByteArray();
                    
                    // Write frame data
                    dos.writeInt(frameData.length);
                    dos.write(frameData);
                    dos.flush();
                } catch (IOException e) {
                    JOptionPane.showMessageDialog(CameraCaptureApp.this, 
                        "Error writing frame: " + e.getMessage());
                }
            }
        }
        
        public void stopRecording() {
            try {
                if (dos != null) {
                    dos.writeUTF("VIDEO_END");
                    dos.close();
                }
                if (fos != null) {
                    fos.close();
                }
            } catch (IOException e) {
                JOptionPane.showMessageDialog(CameraCaptureApp.this, 
                    "Error stopping recording: " + e.getMessage());
            } finally {
                dos = null;
                fos = null;
            }
        }
    }
}
```

## Key Features:

1. **Image Loading**: Load images from file system (can be extended for camera/Android)
2. **Image Capture**: Simulates camera capture (replace with real camera API)
3. **Video Recording**:
   - Start/Stop recording
   - Pause/Resume functionality
   - Save to user-specified location
4. **Image Saving**: Save captured images to file

## For Real Camera/Android Integration:

To make this work with actual cameras or Android devices, you would need:

1. **For Webcam/Monitor Capture**:
```java
// Using JavaCV (OpenCV wrapper)
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0); // 0 for default camera
grabber.start();
Frame frame = grabber.grab();
// Convert Frame to BufferedImage
```

2. **For Android Device Camera**:
   - Set up an Android app that streams camera to a server
   - Connect your Java Swing app to that server
   - Or use Android Debug Bridge (ADB) to capture screens

3. **Proper Video Encoding**:
```java
// Using JavaCV
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("output.mp4", width, height);
recorder.setFormat("mp4");
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.start();
recorder.record(frame);
```

Would you like me to enhance any specific part of this application or explain any component in more detail?

No comments: