المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : العمليات على الصور في Java



Chakira
11-01-2013, بتوقيت غرينيتش 04:35 PM
http://www.dzbatna.com/images/icons/iconrote.gif ط§ظ„ط¹ظ…ظ„ظٹط§طھ ط¹ظ„ظ‰ ط§ظ„طµظˆط± ظپظٹ Java (http://www.dzbatna.com/t2216813/)



السلام عليكم

رايح نتعلم في هذي المقالة كيف نستخدم جافا في العمليات الأساسية على الصور الي غالبا تهم مطورين الويب :


تحويل بين صيغ الصور مثل تحويل صورة jpg إلى png.
تحويل نوع الصور مثل تحويل صورة ملونة لصورة أبيض وأسود بس أو متدرجة بين الأبيض والأسود.
بروزة الصور وتأطيرها.
إقتطاع جزء من صورة في صورة جديدة.
تغيير حجم الصور.


أهم الـclasses الي رايح نستخدمها:


ImageIO (http://go.s-qu.com/xi0tuwxxx80) : وهو المسؤول عن قراءة وكتابة الصور.
BufferedImage (http://go.s-qu.com/9bz4p4ollnm) : يحمل بيانات الصورة وتقدر من خلالة تصل للمعلومات الأساسية عن الصورة مثل نوع الصورة وملومات العرض والإرتفاع والألوان والشفافية.
Graphics2D (http://go.s-qu.com/yvee49ili7t) : يوفر لك كثير من الوظائف الخاصة بالرسم والتلوين والتعديل على الصور.


الصورة المستخدمة (صورة لسديم النسر (http://go.s-qu.com/upehqehnpf2) مأخوذه من هنا (http://go.s-qu.com/glh0z6xpimo)):

http://img534.imageshack.us/img534/1752/imagefde.jpg

تحويل بين صيغ الصور

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

رمز PHP:

<code style="white-space:nowrap"> <code> import javax.imageio.ImageIO; // (1)
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Images {
public static void main(String argv&#91;&#93;) {
try {
BufferedImage image = ImageIO.read(new File("image.jpg")); // (2)
ImageIO.write(image, "png", new File("image.png")); // (3)
} catch (IOException e) {
System.out.println("Error cannot open the image"); // (4)
System.exit(0);
}
}
}
</code> </code>

عند تشغيله رايح تنتج لنا صورة جديدة نوعها png (إفتح الصورة بأي محرر نصوص مثل Notepad ورايح تحصل في البداية ‰PNG):

http://img40.imageshack.us/img40/4162/imagetw.png

(1) في الأسطر الأول إستوردنا الحزم الي نحتاجها، أغلب بيئات التطوير IDEs تتعرف على الحزم الي تختاجها وتستوردها آلياً.

(2) في هذا السطر قرأنا صورة بإستخدام الوظيفة read من ImageIO بعد تمرير كائن File لملف الصورة. الوظيفة read رايح تعيد بيانات الصورة على شكل كائن BufferedImage.

(3) بعد ماقرأنا الصورة أعدنا كتابتها بإستخدام الوظيفة write (http://go.s-qu.com/y4h0bsukcfc) بعد تمرير كائن BufferedImage الخاص بالصورة ثم نوع الصورة png ، تقدر تكتب مثلاً gif أو jpg أو bmp وغيرها من الصيغ، ثم كائن للملف الي بنكتب فيه الصورة.

(4) جملة joomla الـtry و catch لإعتراض أي خطأ ممكن يصير بفتح الصورة (زي لو حاولت تفتح صورة مو موجودة) أو في كتابة الصورة. فيه أخطأ ممكن تحصل مثل لو حاولت تفتح صورة مو موجودة وغيرها من الأخطاء، تقدر تضيف إستثناء لها.

تحويل نوع الصور

لو مثلاً أنشأت كائن جديد من BufferedImage بعد تمرير العرض والإرتفاع ونوع الصورة:

رمز PHP:

<code style="white-space:nowrap"> <code> import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Images {
public static void main(String argv&#91;&#93;) {
try {
BufferedImage image = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB); // (1)
ImageIO.write(image, "png", new File("image.png"));
} catch (IOException e) {
System.out.println("Error cannot open the image");
System.exit(0);
}
}
}
</code> </code>

رايح تنشأ لك صورة فارغة:

http://img255.imageshack.us/img255/6721/imagehy.png

(1) العرض والإرتفاع نعرفه. النوع TYPE_INT_ARGB (http://go.s-qu.com/smswtipbmvm) يعرف بطريقة تنظيم ألوان الصورة وشفافيتها على أنها صورة 4 بايت RGB (ملونة وتدعم تدرجات لونية كبيرة) تقبل الشفافية Alpha.

فيه أنوع عديدة للصور وطرق مختلفة لتمثيل الألوان (إقرأ عنها هنا (http://go.s-qu.com/t8pouhw9vld)) تدعمها جافا تقدر تتعرفها عليها مع هذا البرنامج ووظيفته قرأة صورة وإنشاء صورة جديدة ثم نسخ بيانات الصورة الأولى للثانية:

رمز PHP:

<code style="white-space:nowrap"> <code> import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Images {
public static void main(String argv&#91;&#93;) {
try {
BufferedImage org_image = ImageIO.read(new File("image.jpg")); // (1)
BufferedImage image = new BufferedImage(500, 500, BufferedImage.TYPE_BYTE_BINARY); // (2)

Graphics2D graphics2D = image.createGraphics(); // (3)
graphics2D.drawImage(org_image, 0, 0, null); // (4)

ImageIO.write(image, "png", new File("image.png"));
} catch (IOException e) {
System.out.println("Error cannot open the image");
System.exit(0);
}
}
}
</code> </code>

(1) حملنا صورة من القرص.
(2) أنشأنا صورة فارغة نوعها TYPE_BYTE_BINARY (http://go.s-qu.com/5lfy73en5wz) وتدعم لونين إما أبيض أو أسود (لاحظ أن حجم الصورة قل لـ10 كيلوبايت بس لأنه قل عدد البايتات الازمة لتمثيل اللون):

http://img826.imageshack.us/img826/3333/imageyl.png

(3) حصلنا على كائن Graphics2D من الصورة الجديدة، هذا الكائن زي ماذكرت يوفر لك وظائف كثيرة للرسم واللتعديل في الصور.

(4) رسمنا (نسخنا) الصورة الأصلية فوق الصورة الفارغة بإستخدام الوظيفة drawImage (http://go.s-qu.com/zwvkc0ways8).

تمثيل ثاني مثل TYPE_BYTE_GRAY (http://go.s-qu.com/q9sx84wv74j) يدعم عدد من التدرجات بين الأبيض والأسود:

رمز PHP:

<code style="white-space:nowrap"> <code> import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Images {
public static void main(String argv&#91;&#93;) {
try {
BufferedImage org_image = ImageIO.read(new File("image.jpg"));
BufferedImage image = new BufferedImage(500, 500, BufferedImage.TYPE_BYTE_GRAY);

Graphics2D graphics2D = image.createGraphics();
graphics2D.drawImage(org_image, 0, 0, null);

ImageIO.write(image, "png", new File("image.png"));



} catch (IOException e) {
System.out.println("Error cannot open the image");
System.exit(0);
}
}
}
</code> </code>

http://img842.imageshack.us/img842/7838/imagelz.png

فيه أكثر من نوع للصورة تقدر تحصله في توثيق BufferedImage (http://docs.oracle.com/javase/6/docs/api/java/awt/image/BufferedImage.htm).

بروزة الصور بإطار

مثال على رسم برواز للصورة:

رمز PHP:

<code style="white-space:nowrap"> <code> import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Images {
public static void main(String argv&#91;&#93;) {
try {
int stroke = 10; // (1)
BufferedImage image = ImageIO.read(new File("image.jpg"));

Graphics2D graphics2D = image.createGraphics(); // (2)
graphics2D.setColor(new Color(255, 216, 33)); // (3)
graphics2D.setStroke(new BasicStroke(stroke)); // (4)
graphics2D.drawRect(stroke / 2,
stroke / 2,
image.getWidth() - stroke,
image.getHeight() - stroke); // (5)

ImageIO.write(image, "png", new File("image.png"));
} catch (IOException e) {
System.out.println("Error cannot open the image");
System.exit(0);
}
}
}
</code> </code>

الصورة الناتجة:

http://img846.imageshack.us/img846/3517/imagege.png

(1) في السطر الأول حدد حجم الإطار الي بنستخدمه بـ10 بكسل.
(2) مثل ماذكرت، للتعديل على الصور يلزمنا الحصول على كائن نوعه Graphics2D لأنه هو الي يوفر وظائف الرسم.
(3) إستدعينا الوظيفة ملتقى طلبة جامعة القصيم - إعادة التوجيه... (http://go.s-qu.com/a99998oyaol)setColor ومررنا لها كائن Color جديد ومررنا له اللون الي رايح نستخدمه مع الإطار. اللون يستخدم تمثيل الـRGB ويعني Red, Green, Blue. تقدر تختار اللون من هنا (http://go.s-qu.com/s3xpp3o5tl8) أو من الرسام مثلاً أومباشرة بدل ماتمرر كائن مرر اللون إذا كان شهير مثل Color.YELLOW. إقرأ توثيق Color.
(4) هنا نحدد عرض الإطار بإستخدام الوظيفة setStroke (http://go.s-qu.com/nrrfv6mv8ou) وتمرير كائن من نوع BasicStroke (http://go.s-qu.com/sb05b0stil5). بنّاء الكائن له أكثر من شكل overloaded تقدر تشوف أشكال الـstocke في التوثيق (إذا بتسوي إطار بحدود منحنية مثلاً).
(4) هنا نرسم مربع الي يمثل إطارنا. الإطار الي عملناه إطار داخلي inner border ولعمل إطار دخلي يلزمك البدء من نصف حجم الإطار (الرقم الصحيح من ناتج حجم الإطار ÷ 2) وعرض\إرتفاع المربع يساوي عرض\إرتفاع الصورة ناقص عرض الإطار.

إقتطاع جزء من صورة في صورة جديدة

لوحبينا نقطع الصورة crop الي في الجزء الأصفر:

http://img546.imageshack.us/img546/1466/imagekg.png

نقدر نسوي هذا الشيء بإنشاء صورة جديدة فارغة (بإنشاء كائن BufferedImage جديد) وإستدعاء الوظيفة getSubImage من كائن BufferedImage التابع للصورة الأصلية.

في الصورة السابقة حجم الصورة الجزئية 250x250 ونحناج نقتطع من الركن الأعلى الأيسر (0, 0):

رمز PHP:

<code style="white-space:nowrap"> <code> import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Images {
public static void main(String argv&#91;&#93;) {
try {
int width = 250; // (1)
int height = 250; // (2)

BufferedImage org_image = ImageIO.read(new File("image.jpg")); // (3)
BufferedImage new_image = org_image.getSubimage(0, 0, width, height); // (4)

ImageIO.write(new_image, "png", new File("image.png")); // (5)
} catch (IOException e) {
System.out.println("Error cannot open the image");
System.exit(0);
}
}
}
</code> </code>

الصورة الناتجة:

http://img132.imageshack.us/img132/8320/imagekf.png

(1) عرض الصورة الفرعية.
(2) إرتفاع الصورة الفرعية.
(3) حصلنا على كائن BufferedImage من صورة على القرص.
(4) حصلنا على كائن BufferedImage لجزء من الصورة الأصلية.
(5) حفظنا الصورة الجديدة.

تقدر تغير مكان القطع بتغيير الأصفار. مثلاً تبي الربع الأيمن من تحت تقدر تبدل الأصفار لـ250، 250:

رمز PHP:

<code style="white-space:nowrap"> <code> import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Images {
public static void main(String argv&#91;&#93;) {
try {
int width = 250;
int height = 250;

BufferedImage org_image = ImageIO.read(new File("image.jpg"));
BufferedImage new_image = org_image.getSubimage(250, 250, width, height)

ImageIO.write(new_image, "png", new File("image.png"));
} catch (IOException e) {
System.out.println("Error cannot open the image");
System.exit(0);
}
}
}
</code> </code>

ورايح تنتج:

http://img198.imageshack.us/img198/9691/imagemjs.png

إذا حبيت تقتطع منتصف الصورة، مكان القطع يكون (عرض\إرتفاع الصورة الأصلية - عرض\إرتفاع الصورة الفرعية) ÷ 2، هذا القانون مهم جداً (تذكره) وتقدر تستخدمة لتوسيط أي جسم. وبرنامجنا يكون:

رمز PHP:

<code style="white-space:nowrap"> <code> import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Images {
public static void main(String argv&#91;&#93;) {
try {
int width = 250;
int height = 250;

BufferedImage org_image = ImageIO.read(new File("image.jpg"));
BufferedImage new_image = org_image.getSubimage((org_image.getWidth() - width) / 2,
(org_image.getHeight() - height) / 2,
width,
height);

ImageIO.write(new_image, "png", new File("image.png"));
} catch (IOException e) {
System.out.println("Error cannot open the image");
System.exit(0);
}
}
}
</code> </code>

الصورة الناتجة:

http://img208.imageshack.us/img208/7153/imagelvj.png

تغيير حجم الصور

تغير حجم الصورة عملية بسيطة، كل الي تحتاجة أنك تشئ صورة جديدة وترسم صورة جديدة من الصورة الأصلية، مثال على تحجم الصورة لحجم محدد 250x250:

رمز PHP:

<code style="white-space:nowrap"> <code> import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Images {
public static void main(String argv&#91;&#93;) {
try {
int width = 250; // (1)
int height = 250;

BufferedImage org_image = ImageIO.read(new File("image.jpg"));
BufferedImage new_image = new BufferedImage(width, height, org_image.getType()); // (2)

Graphics2D graphics2D = new_image.createGraphics(); // (3)

graphics2D.drawImage(org_image, 0, 0, width, height, null); // (4)

ImageIO.write(new_image, "png", new File("image.png")); // (5)
} catch (IOException e) {
System.out.println("Error cannot open the image");
System.exit(0);
}
}
}
</code> </code>

الصورة الناتجة:

http://img210.imageshack.us/img210/6811/imagegp.png

(1) عرض وإرتفاع الصورة الجديدة.
(2) كائن BufferedImage جديد للصورة الجديدة عرضها 250 وإرتفاعها 250 ونوعها يطابق نوع الصورة الأصلية.
(3) حلصنا على كائن Graphics2D من الصورة الجديدة.
(4) الصورة الجديدة طبعاً فارغة، نعيد رسم الصورة الأصلية داخل الجديدة و drawImage (http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/Graphics2D.html#drawImage(java.awt.image.BufferedI mage, java.awt.image.BufferedImageOp, int, int)) إفتراضياً رايح تحشر الصورة على عكس مثال الإقتطاع.
(5) كتبنا الصورة الجديدة لملف جديد.

لو حبيت تصغر الصورة بنسبة معينة، مثلاً تصغيرها للنصف، إضرب أبعاد الصورة الأصلية بالنسبة، مثلاً العرض × 0.50. مثال:

رمز PHP:

<code style="white-space:nowrap"> <code> import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Images {
public static void main(String argv&#91;&#93;) {
try {
float resize_by = 0.5F;

BufferedImage org_image = ImageIO.read(new File("image.jpg"));
BufferedImage new_image = new BufferedImage((int) (org_image.getWidth() * resize_by),
(int) (org_image.getHeight() * resize_by),
org_image.getType());

Graphics2D graphics2D = new_image.createGraphics();

graphics2D.drawImage(org_image,
0,
0,
(int) (org_image.getWidth() * resize_by),
(int) (org_image.getHeight() * resize_by),
null);

ImageIO.write(new_image, "png", new File("image.png"));
} catch (IOException e) {
System.out.println("Error cannot open the image");
System.exit(0);
}
}
}
</code> </code>

الصورة الناتجة:

http://img210.imageshack.us/img210/6811/imagegp.png

بالتوفيق : ).






ألعاب الأندرويد مجانا و حصريا (http://www.apotox.info/forum)




https://fbcdn-sphotos-d-a.akamaihd.net/hphotos-ak-ash4/482113_236967293114455_1193518507_n.png (http://www.dzbatna.com)
©المشاركات المنشورة تعبر عن وجهة نظر صاحبها فقط، ولا تُعبّر بأي شكل من الأشكال عن وجهة نظر إدارة المنتدى (http://www.dzbatna.com)©

استعمل مربع البحث في الاسفل لمزيد من المواضيع


سريع للبحث عن مواضيع في المنتدى