Java Image I/O API: تغيير حجم وقص الصور | دليل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع الصور في Java: تغيير الحجم (resize) والقص (crop)



في تطوير الويب وسطح المكتب الحديث باستخدام Java، غالبًا ما تكون هناك حاجة لمعالجة الصور برمجيًا: تصغيرها للمعاينات، قص الحواف الزائدة، أو ضبطها لأبعاد محددة. لا توجد في المكتبة القياسية لـ Java (Java SE) فئة واحدة عالية المستوى لهذه العمليات، ولكن توجد مجموعة قوية من الأدوات في الحزم java.awt وjava.awt.image وjavax.imageio. في هذه المقالة، سنشرح بالتفصيل كيفية تنفيذ عمليات تغيير الحجم (resize) والقص (crop) باستخدام الأدوات المدمجة في Java.



الفئات الأساسية للعمل مع الصور



قبل البدء في الكود، دعنا نتعرف على الفئات الرئيسية:

  • javax.imageio.ImageIO – قراءة وكتابة الصور (يدعم PNG وJPEG وBMP وGIF وغيرها).
  • java.awt.image.BufferedImage – صورة نقطية مع إمكانية الوصول إلى البكسلات.
  • java.awt.Graphics2D – فئة للرسم (التحجيم، القص، التراكب).
  • java.awt.geom.AffineTransform – مصفوفة تحويل للتحجيم الدقيق.


1. تغيير حجم الصورة (Resize)



الطريقة الأكثر شيوعًا هي إعادة رسم الصورة الأصلية على لوحة جديدة بالأبعاد المطلوبة. للحصول على نتيجة عالية الجودة، استخدم RenderingHints.



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

public class ImageResizer {

public static BufferedImage resize(BufferedImage original, int targetWidth, int targetHeight) { BufferedImage resized = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB); 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; }

public static void main(String[] args) throws IOException { File input = new File("input.jpg"); BufferedImage source = ImageIO.read(input);

// التصغير إلى 300x200 BufferedImage output = resize(source, 300, 200); ImageIO.write(output, "jpg", new File("resized.jpg")); System.out.println("تم تغيير الحجم بنجاح!"); }}


ملاحظات مهمة:

  • إذا لم يتم تعيين RenderingHints، ستكون النتيجة منخفضة الجودة (بكسل متجاور).
  • لصور PNG ذات الشفافية، استخدم BufferedImage.TYPE_INT_ARGB.
  • لا يتم الحفاظ على الأبعاد تلقائيًا – عند الحاجة، احسب نسبة العرض إلى الارتفاع يدويًا.


2. الحفاظ على نسبة العرض إلى الارتفاع (Aspect Ratio)



لتجنب تشويه الصورة، احسب الحجم الجديد مع الحفاظ على النسبة:



public static BufferedImage resizeKeepRatio(BufferedImage original, int maxWidth, int maxHeight) {    int origWidth = original.getWidth();    int origHeight = original.getHeight();

double widthRatio = (double) maxWidth / origWidth; double heightRatio = (double) maxHeight / origHeight; double ratio = Math.min(widthRatio, heightRatio);

int newWidth = (int) (origWidth * ratio); int newHeight = (int) (origHeight * ratio);

return resize(original, newWidth, newHeight);}


3. قص الصورة (Crop)



يتم القص في Java باستخدام طريقة getSubi

توصيات