سؤال

أود أن أعرف ما إذا كانت هناك طريقة لإنشاء ImageIcon وهي مرآة ImageIcon أخرى.

البحث على جوجل، لقد وجدت كيفية القيام بذلك باستخدام العديد من مكتبات AWT.

هل هناك طريقة للقيام بذلك مع الأرجوحة؟ إذا لم يكن الأمر كذلك، فأنا ما زلت أواجه مشكلات مع طريقة AWT:

ImageIcon أريد مرآيه هو GIF متحرك (مع تحتوي على لون شفاف) وطريقة AWT إرجاع غير شفافة (يتم تغيير اللون الشفاف إلى Opaque Black) و GIF غير المتحركة.

أي أفكار كيفية الحفاظ على الرسوم المتحركة واللون الشفاف؟

هنا هو رمز AWT الذي وجدته (Rangerstand كونه ImageIcon الأصلي):

 Image reversed = rangerStand.getImage();
 BufferedImage bufferedImage = new BufferedImage(reversed.getWidth(null), reversed.getHeight(null), BufferedImage.TYPE_INT_RGB);
 Graphics gb = bufferedImage.getGraphics();
 gb.drawImage(reversed, 0, 0, null);
 gb.dispose();

 AffineTransform tx = AffineTransform.getScaleInstance(-1, 1);
 tx.translate(-reversed.getWidth(null), 0);
 AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
 bufferedImage = op.filter(bufferedImage, null);
 ImageIcon lol = new ImageIcon(bufferedImage);
 this.sprite.setIcon(lol);

شكرا للقراءة.

هل كانت مفيدة؟

المحلول

قد ترغب في محاولة وتكثيف فئة ImageIcon ورسم الصورة عكسها. جرب هذه القطعة من التعليمات البرمجية، قد تفعل الخدعة (لم أحاول مع GIF الشفاف المتحركة ولكن يجب أن تعمل):

تحرير: قمت بتغيير الرمز قليلا واختبرها مع GIF متحركة. إنها تعمل!

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;


/**
 * @author Savvas Dalkitsis
 */
public class Test {

    public static void main(String[] args) {
        JFrame f = new JFrame("Test");
        JLabel l = new JLabel();
        ImageIcon io = new MirrorImageIcon("test.gif");
        l.setIcon(io);
        f.getContentPane().add(l);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setVisible(true);
    }

}

@SuppressWarnings("serial")
class MirrorImageIcon extends ImageIcon {

    public MirrorImageIcon(String filename) {
        super(filename);
    }

    @Override
    public synchronized void paintIcon(Component c, Graphics g, int x, int y) {
        Graphics2D g2 = (Graphics2D)g.create();
        g2.translate(getIconWidth(), 0);
        g2.scale(-1, 1);
        super.paintIcon(c, g2, x, y);
    }

}

نصائح أخرى

لا فكرة عن كيفية حل المشكلة مع الأرجوحة الأصلية أو AWT - على الرغم من أن Java يدعم GIF89A مع الشفافية والرسوم المتحركة. أعتقد أنه يجب عليك فك GIF89A، ومرآة صور الرسوم المتحركة One-by-One وأعمدة. هناك مكتبة واحدة على الأقل يمكنك تقديمها: GIF4J ضوء

بادئ ذي بدء، يعتمد دعم الصورة في الأرجوحة على AWT، لذلك "القيام بذلك بسيطة" لا معنى له الكثير.

باستثناء ذلك، لديك مشكلتان: الحفاظ على الشفافية والحفاظ على الرسوم المتحركة. القضية الأولى بسيطة لحلها. مع BufferedImage.TYPE_INT_RGB, ، أنت تقوم بإنشاء مخزن مؤقت جديد دون قناة ألفا (معلومات الشفافية). إذا قمت بتغيير النوع إلى BufferedImage.TYPE_INT_ARGB, ، يجب إصلاح هذه المشكلة.

بت الرسوم المتحركة أصعب بعض الشيء. لا تدعم صورة أو BufferedImage الرسوم المتحركة حقا، ولكن باستخدام GIF متحرك كصدر وعرض الصورة في مكون واجهة المستخدم الرسومية يؤدي إلى نوع من التفاعل غير الكشف عن الصورة بين الصورة ومكون واجهة المستخدم الرسومية، مما يؤدي إلى عرض الرسوم المتحركة. ربما تسبب طريقة نسخ الصورة الأصلية إلى BufferedImage على الأرجح الإطار الفردي، والذي يتم عرضه حاليا ليتم نسخه في BufferedImage. إنه أكثر من سطرين من التعليمات البرمجية، ولكن يمكنك استخدام ImageReader في JAVAX.IMAGEIO لقراءة كل إطار واحد من GIF وكتابة الصور المتحركة لإنشاء GIF متحرك جديد من الصور المتطابقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top