الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

من النمط Image إلى النمط Graphics

مغلق
بدأه MMSs في 6 أغسطس 2005 · 6 رد · 674 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سؤالي بسيط ولكن للخبراء،

كيف يمكن أن أنقل صورة jpg موجودة في غرض من نمط Image إلى غرض من نمط Graphics.

إن لم يكن هناك غموض في سؤالي ففيه عدم وضوح، ولأوضحه أكثر يمكنني القول: هناك طريقة لغرض من نمط Image هي getGraphics() تعيد غرض جديد من النمط Graphics، وهذا هو المطلوب. ولكن كيف يمكنني الاستفادة من هذه الطريقة لأستطيع معالجة الصورة وكأنها غرض Graphics.

إذا كان سؤالي غير واضح أرجو الإشارة إلى نقطة الاستفهام لأوضح.

ولكم الشكر على الاهتمام والمعونة.

#2

:)

تقصد إحدى اثنتين:

الأولى: عندك Image وتريد أن ترسمه على لوحة مثلا JPanel :

public class MyImagePanel extends JPanel{
Image myImage= getImageFromSomeWhere();
public void paint(Graphics g){
super.paint(r);
g.drawImage(myImage);
}

}

إن لم أخطئ في كتابة المثال، فستظهر الصورة بإذن الله على JPanel.

الثانية: عندك Image وتريد أن تحرر هذه الصورة بأن ترسم فوقها ما تريد ولنفرض تريد رسم مربع فوقها حتى يصبح المربع جزء من الصورة.

Graphics g=myImage.getGraphics();
g.fillRect(0,0,10,10);

بالتوفيق!

#3

شكراً لك أخي أبو مازن على الرد السريع،

في الواقع إن طلبي هو الثاني بالضبط. ولكن هناك مشكلة!

فقد ظهرت لي رسالة الخطأ التالية:

java.lang.IllegalAccessError: getGraphics() only valid for images created with createImage(w, h

للسطر الأول

Graphics g=myImage.getGraphics();

مع العلم بأني أحمل صورة jpg من ملف وليست منشأة بالطريقة createImage المذكورة في رسالة الخطأ.

تم تعديل هذه المشاركة بواسطة MMSs في 7 أغسطس 2005 في 01:03

#4

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

أرجو أن تخبرني إن نجحت هذه الطريقة!

Image myImage = getSomeImageFromSomeWhere();  // Probably you cant edit this because it is from file. So copy it
// to different Memmory Image.
BufferedImage bufferedImage = new BufferedImage ( myImage.getWidth(), myImage.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
Graphics g=bufferedImage.getGraphics();
g.drawImage(myImage);
//now you have bufferedImage which can be edited!!
g.fillRect(0,0,10,10);

بالتوفيق!!

#5

عندي سؤال هنا،

أين يتم في هذه الشيفرة نسخ myImage إلى bufferedImage ، فبعد إنشاء bufferedImage يتم فوراً إسناد المثل المسترجع من الطريقة getGraphics إلى الغرض g مع أن bufferedImage لا تملك الصورة بعد. أم أنا فهمت خطأً.

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

  public void paint(Graphics g) {
    drawTheImage(g);
  }
  
  void drawTheImage(Graphics g) {
    g.drawImage(img, 0, 0, this);
    g.fillRect(25, 25, 75, 75);
  }

ولكن مع ذلك لم أحقق ما أريد. فما أريده -في الواقع- ليس مجرد معالجة الصورة ولكني أريد أن أستطيع قراءة الصورة بيكسل بيكسل، ومعرفة لون كل بيكسل، بالإضافة للقدرة على التخزين في ملف، وكنت أعتقد أن هذا ممكن أكثر مع غرض من النمط Graphics، فإذا كنت ترى غير ذلك فأتمنى أن تزيدنا من علمك.

ولك الشكر..

#6

أرجو أن يفي هذا بالغرض!

لاحظ أني قرأت صورة من ملف، ووضعتها في BufferedImage

رسمت خطوطا كثيرة فوق الصورة، وأصبحت جزء من الصورة!!

بعد ذلك رسمت الصورة المحررة عدة مرات على صفحة JPanel!!

من الملاحظ طبعا أن BufferedImage تستطيع قراءة النقاط من خلال:

bImage.getRGB();

لاحظ معي أن Image عبارة عن صورة، وGraphics عبارة عن فرشاة ألوان!! إن أردت أن ترسم فعليك بفرشاة الألوان!!

هذه شفرة البرنامج كاملة:

import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import javax.swing.text.*;
import javax.imageio.*;

class TestProject extends JPanel{
	BufferedImage bImage;
	public TestProject()throws java.io.IOException{
  bImage = ImageIO.read(new java.io.File("11.jpg"));
  Graphics g=bImage.getGraphics();
  g.setColor(Color.red);
  for(int i=0;i<bImage.getWidth();i+= bImage.getWidth()/10)
 	 g.drawLine(i,0,bImage.getWidth()-i,bImage.getHeight());
  g.setColor(Color.green);
  for(int i=0;i<bImage.getHeight();i+= bImage.getHeight()/10)
 	 g.drawLine(0,i,bImage.getWidth(),bImage.getHeight()-i);
  bImage.getRGB(5,6);
  bImage.setRGB(10,6,123123);

	}
	public void paint(Graphics g){
  super.paint(g);
  Graphics2D g2=(Graphics2D)g;
  for(int i=0;i<this.getWidth();i+= getWidth()/10)
 	 g.drawImage(bImage, i,i, 150, 150, null);

	}
	public static void main(String[]args)throws Exception{
  JFrame frame=new JFrame();
  frame.add(new TestProject());
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.pack();
  frame.setSize(400,400);
  frame.setVisible(true);
	}
}

أرجو أن يكون مفيدا!!

بالتوفيق!!

#7

هذا أكثر من ممتاز، شكراً جزيلاً لك ولمعونتك لي.

أهم جزء في الشيفرة بالنسبة لي كان التعامل مع غرض الصف BufferedImage ، وبشكل خاص الطريقة getRGB. أستطيع الآن قراءة لون معين وإعادة رسمه في غرض من Graphics أو حتى حفظ بيكسلات معينة عن طريق اللون.

أشكرك مرة أخرى،

وربما هناك بعض الأسئلة القادمة...

هذا الموضوع مغلق.

مواضيع مشابهة