صور جافا مع قناة ألفا دون استخدام صورة مخزنة
سؤال
أنا أرسم مجموعة من البلاط على أ Canvas
, ، يتم تمثيل هذه البلاط بأي منهما Image
S أو BufferedImage
س.
لقد لاحظت أن أنا أحصل على تعادل مللي ثانية Image
S لكن ما أبدأ باستخدامه BufferedImage
S للبلاط RISTSTS Time Sky Rockts إلى أعلى من 20ms.
BufferedImage buffered = ImageIO.read(new File(fileName));
Image image = Toolkit.getDefaultToolkit().createImage(fileName);
كل من هذه الصور تدعم قنوات ألفا. أود أن أبدأ في استخدام ألفا قادر Image
's للمؤسسات الوسيطة. ومع ذلك ، لم أجد مكانًا في JDK يمكنه إنشاءها إلى جانب استدعاء مجموعة الأدوات هذه لإنشاء واحد من ملف.
في الأساس ، هل يعرف أي شخص كيفية إنشاء صورة فارغة (وليس BufferedImage) من نقطة الصفر التي يمكن أن تدعم ألفا؟
المحلول
للإجابة على سؤالك مباشرة:
// Create a empty BufferedImage which supports alpha
// It will be just as fast a Toolkit image
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
بعض الخلفية:
كل ذلك يعود إلى نوع bufferedimage الذي تستخدمه. يوفر BufferedImage مُنشئًا يمكنك فيه تحديد النوع (int_argb ، 4byte_argb ، إلخ). عند استخدام Imageio ، ليس لديك تحكم في النوع الذي يعتاد في بناء bufferedimage. يستخدم Imageio النوع "0" وهو مخصص. يحكم النوع كيف يتم تخزين/الوصول إلى بيانات الصورة في الذاكرة والتي تلعب بشكل كبير كيفية رسم الصورة/نسخها/مزرعة على الشاشة (أو صورة أخرى).
لقد قمت بإنشاء اختبار بسيط استنادًا إلى الكود الخاص بك ، ويجعل العزف على العزف دائمًا ببطء شديد. أقوم بإنشاء bufferedimage ثانية مع type_int_argb ونسخ أول عازلة (من صورة) فيها. هذا type_int_argb bufferedImage يعرض بنفس سرعة صورة مجموعة الأدوات.
نصائح أخرى
يمكنك استخدام واجهة برمجة تطبيقات ImageConsumer/ImageProducer القديمة لإنشاء كائنات صورة مع أي محتوى تريده.
سيؤدي ذلك إلى إنشاء كائن صورة من بكسل ARGB في pix
صفيف مع العرض المعطى والارتفاع:
public static Image createImage( int width, int height, int[] pix )
{
return createImage( width, height, pix, 0, width );
}
public static Image createImage( int width, int height, int[] pix, int offs, int scan )
{
Toolkit toolkit = Toolkit.getDefaultToolkit();
ImageProducer source = new MemoryImageSource( width, height, pix, offs, scan );
return toolkit.createImage( source );
}