العمل مع الصور في Java: المكتبات والأدوات وأمثلة الكود
توفر Java أدوات مدمجة قوية للعمل مع الرسومات، بالإضافة إلى نظام بيئي غني من المكتبات الخارجية. في هذه المقالة، سنستعرض الطرق الأساسية لتحميل الصور ومعالجتها وتحويلها وحفظها في Java — بدءًا من الفئات القياسية javax.imageio و java.awt وصولاً إلى المكتبات الشائعة التي تسهل حياة المطور.
1. الأدوات القياسية: javax.imageio و java.awt.image
يعتمد العمل الأساسي مع الصور النقطية في Java على الحزمة javax.imageio (التحميل/الحفظ) و java.awt.image (العمل مع البكسلات). الفئة الرئيسية هي BufferedImage، التي تخزن الصورة في الذاكرة العاملة.
تحميل وحفظ الصورة
import javax.imageio.ImageIO;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;
public class ImageExample { public static void main(String[] args) throws IOException { // تحميل الصورة من ملف BufferedImage image = ImageIO.read(new File("input.jpg")); System.out.println("العرض: " + image.getWidth() + ", الارتفاع: " + image.getHeight());
// الحفظ بتنسيق آخر ImageIO.write(image, "png", new File("output.png")); }}يدعم ImageIO التنسيقات: JPEG وPNG وBMP وWBMP وGIF (للقراءة فقط). لتوسيع قائمة التنسيقات، استخدم إضافات ImageIO (مثل TwelveMonkeys).
تغيير الحجم (طريقة يدوية)
import java.awt.Graphics2D;import java.awt.RenderingHints;import java.awt.image.BufferedImage;
public static BufferedImage resize(BufferedImage original, int newWidth, int newHeight) { BufferedImage resized = new BufferedImage(newWidth, newHeight, original.getType()); Graphics2D g2d = resized.createGraphics(); g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g2d.drawImage(original, 0, 0, newWidth, newHeight, null); g2d.dispose(); return resized;}2. Java 2D API: الرسم والمرشحات
تتيح الفئة Graphics2D ليس فقط تغيير الحجم، بل أيضًا تطبيق التأثيرات والتدوير والقص وإضافة النصوص والأشكال الهندسية.
إضافة علامة مائية
public static BufferedImage addWatermark(BufferedImage source, String text) { BufferedImage result = new BufferedImage(source.getWidth(), source.getHeight(), source.getType()); Graphics2D g2d = result.createGraphics(); g2d.drawImage(source, 0, 0, null); g2d.setColor(new Color(255, 255, 255, 128)); g2d.setFont(new Font("Arial", Font.BOLD, 40)); g2d.drawString(text, 20, source.getHeight() - 20); g2d.dispose(); return result;}تطبيق مرشح الألوان (السيبيا)
public static BufferedImage applySepia(BufferedImage img) { int width = img.getWidth(); int height = img.getHeight(); BufferedImage sepia = new BufferedImage(width, height, img.getType());
for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int rgb = img.getRGB(x, y); int r = (rgb >> 16) & 0xFF; int g = (rgb >> 8) & 0xFF; int b = rgb & 0xFF;
int newR = (int) (0.393 * r + 0.769 * g + 0.189 * b); int newG = (int) (0.349 * r + 0.686 * g + 0.168 * b); int newB = (int) (0.272 * r + 0.534 * g + 0.131 * b);
newR = Math.min(255, newR); newG = Math.min(255, newG); newB = Math.min(255, newB);
int newPixel = (0xFF << 24) | (newR << 16) | (newG << 8) | newB; sepia.setRGB(x, y, newPixel); } } return sepia;}