Java में इमेज प्रोसेसिंग: resize और crop करना सीखें

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Java में इमेज प्रोसेसिंग: आकार बदलना (resize) और क्रॉप करना (crop)

आधुनिक वेब और डेस्कटॉप एप्लिकेशन डेवलपमेंट में ग्राफिक फ़ाइलों को प्रोसेस करना अक्सर ज़रूरी हो जाता है। Java में इमेज प्रोसेसिंग के लिए बहुत शक्तिशाली बिल्ट-इन टूल्स मौजूद हैं, जिनके लिए किसी थर्ड-पार्टी लाइब्रेरी की ज़रूरत नहीं है। इस लेख में हम दो बुनियादी ऑपरेशनों को विस्तार से समझेंगे: इमेज का आकार बदलना (resize) और क्रॉप करना (crop), जो javax.imageio और java.awt के स्टैंडर्ड क्लासेज का उपयोग करके किए जाते हैं।

Java में इमेज प्रोसेसिंग के लिए मुख्य क्लासेज

उदाहरणों पर जाने से पहले, Java 2D API के उन मुख्य कंपोनेंट्स को जान लेते हैं जो इस काम में काम आएंगे:

  • BufferedImage — इमेज को पिक्सल लेवल पर एक्सेस करने के लिए मुख्य क्लास।
  • Graphics2D — ड्रॉइंग कॉन्टेक्स्ट, जो ट्रांसफॉर्मेशन, स्केलिंग और ड्रॉइंग की सुविधा देता है।
  • AffineTransform — एफ़िन ट्रांसफॉर्मेशन (स्केलिंग, रोटेशन, शिफ्ट) के लिए क्लास।
  • ImageIO — विभिन्न फॉर्मेट (JPEG, PNG, BMP आदि) में इमेज को पढ़ने और लिखने के लिए यूटिलिटी क्लास।

ये सभी क्लासेज JDK के स्टैंडर्ड सेट में शामिल हैं, इसलिए इनका उपयोग करने के लिए Maven/Gradle जैसी कोई अतिरिक्त डिपेंडेंसी जोड़ने की ज़रूरत नहीं है।

1. इमेज का आकार बदलना (resize)

इमेज का आकार बदलने (स्केलिंग) का ऑपरेशन दो मुख्य तरीकों से किया जा सकता है: Graphics2D का उपयोग करके (सबसे लचीला तरीका) या AffineTransformOp के माध्यम से (इंटरपोलेशन पर अधिक नियंत्रण के लिए)। दोनों तरीकों को समझते हैं।

तरीका 1: Graphics2D के माध्यम से (ज़्यादातर कामों के लिए अनुशंसित)

यह तरीका तब उपयुक्त है जब आपको क्वालिटी बनाए रखते हुए जल्दी से आकार बदलना हो। इसमें हम मूल इमेज को एक नए BufferedImage कैनवास पर मनचाहे आकार में ड्रॉ करते हैं।

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class ImageResizer {

    public static BufferedImage resize(BufferedImage originalImage, int targetWidth, int targetHeight) {
        // निर्दिष्ट आकार और RGB टाइप के साथ नई इमेज बनाएँ
        BufferedImage resizedImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
        
        // ड्रॉइंग कॉन्टेक्स्ट प्राप्त करें
        Graphics2D graphics2D = resizedImage.createGraphics();
        
        // बेहतर क्वालिटी के लिए स्मूथिंग चालू करें
        graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        graphics2D.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        
        // मूल इमेज को नए आकार में स्केल करके ड्रॉ करें
        graphics2D.drawImage(originalImage, 0, 0, targetWidth, targetHeight, null);
        graphics2D.dispose(); // रिसोर्सेज को मुक्त करें
        
        return resizedImage;
    }

    public static void main(String[] args) throws Exception {
        // मूल इमेज पढ़ें
        BufferedImage original = ImageIO.read(new File("input.jpg"));
        
        // आकार बदलकर 800x600 पिक्सल करें
        BufferedImage resized = resize(original, 800, 600);
        
        // परिणाम सेव करें
        ImageIO.write(resized, "jpg", new File("output_resized.jpg"));
        System.out.println("इमेज का आकार बदलकर सेव कर दिया गया है।");
    }
}

महत्वपूर्ण: क्वालिटी बेहतर बनाने के लिए RenderingHints का उपयोग करें। VALUE_INTERPOLATION_BILINEAR स्पीड और क्वालिटी का अच्छा संतुलन देता है, जबकि VALUE_INTERPOLATION_BICUBIC इमेज को छोटा करते समय सबसे अच्छी क्वालिटी प्रदान करता है।

तरीका 2: AffineTr

अनुशंसाएँ