العمل مع الصور في Java: المكتبات والأمثلة العملية
توفر Java أدوات مدمجة قوية للعمل مع الصور النقطية. في هذه المقالة، سنستعرض المكتبة القياسية javax.imageio، والحزمة java.awt.image، والمكتبة الخارجية الشهيرة Thumbnailator. ستتعلم كيفية قراءة الصور وحفظها وتغيير حجمها وتطبيق المرشحات وتحويل تنسيقاتها.
1. الأساسيات: الحزمة javax.imageio و BufferedImage
الفئة الأساسية لتمثيل الصورة في الذاكرة هي BufferedImage. تتيح لك الحصول على البكسلات وتعديلها، والعمل مع نماذج ألوان مختلفة (RGB، ARGB) وأنواع بيانات متنوعة.
قراءة صورة من ملف
import javax.imageio.ImageIO;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;
public class ImageReadExample { public static void main(String[] args) { try { File inputFile = new File("input.jpg"); BufferedImage image = ImageIO.read(inputFile); System.out.println("العرض: " + image.getWidth()); System.out.println("الارتفاع: " + image.getHeight()); System.out.println("النوع: " + image.getType()); } catch (IOException e) { e.printStackTrace(); } }}كتابة صورة إلى ملف
File outputFile = new File("output.png");ImageIO.write(image, "png", outputFile); // يتم تحديد التنسيق من الامتدادالتنسيقات المدعومة: JPEG، PNG، BMP، WBMP، GIF (للقراءة فقط). يمكن الحصول على القائمة الكاملة عبر ImageIO.getReaderFormatNames().
2. تغيير الحجم والتحويلات باستخدام Java 2D
تتيح الحزمة java.awt.Graphics2D إجراء تغيير الحجم عالي الجودة، والتدوير، والانعكاس، وتراكب الصور.
تغيير الحجم مع الحفاظ على النسب
import java.awt.Graphics2D;import java.awt.RenderingHints;import java.awt.image.BufferedImage;
public class ImageResizer { public static BufferedImage resize(BufferedImage original, int targetWidth, int targetHeight) { BufferedImage resized = new BufferedImage(targetWidth, targetHeight, original.getType()); Graphics2D g2d = resized.createGraphics(); // تفعيل التنعيم للحصول على جودة أفضل g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.drawImage(original, 0, 0, targetWidth, targetHeight, null); g2d.dispose(); return resized; }}تدوير الصورة بمقدار 90 درجة
public static BufferedImage rotate(BufferedImage image, double angleDegrees) { double radians = Math.toRadians(angleDegrees); int w = image.getWidth(); int h = image.getHeight(); // الحجم الجديد بعد التدوير int newW = (int) Math.abs(w * Math.cos(radians)) + (int) Math.abs(h * Math.sin(radians)); int newH = (int) Math.abs(h * Math.cos(radians)) + (int) Math.abs(w * Math.sin(radians)); BufferedImage rotated = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = rotated.createGraphics(); g2d.translate((newW - w) / 2.0, (newH - h) / 2.0); g2d.rotate(radians, w / 2.0, h / 2.0); g2d.drawImage(image, 0, 0, null); g2d.dispose(); return rotated;}3. تطبيق المرشحات: التمويه، التباين، السطوع
لتصفية الصور، استخدم BufferedImageOp (من الحزمة java.awt.image). التطبيقات الأكثر فائدة:
- \