عندما تكون كمية معلومات الصورة كبيرة ويتم استخدام طريقة العرض المباشر المذكورة أعلاه، قد يتم عرض الجزء الأمامي وقد يتم عرض الجزء الأخير، لأن الجزء الأخير لم تتم قراءته من الملف، مما يتسبب في ظهور الشاشة مرقطة. من أجل تحسين تأثير العرض، تستخدم العديد من التطبيقات تقنية التخزين المؤقت للصور، أي أولاً تحميل الصورة بالكامل في الذاكرة، ورسم الصورة أو الرسومات في المخزن المؤقت، ثم إخراج الصورة أو الرسومات المرسومة في المخزن المؤقت على الشاشة مرة واحدة. تقنية التخزين المؤقت لا تحل مشكلة الوميض فحسب، بل نظرًا لأن الصورة يتم إنشاؤها في ذاكرة الكمبيوتر، يمكن للبرنامج إجراء معالجة على مستوى البكسل على الصورة وإكمال تحويلات الصورة المعقدة قبل عرضها.
[مثال] برنامج تطبيقي صغير يوضح تقنية عرض المخزن المؤقت للصور. عند تشغيل البرنامج، عند الضغط بالماوس داخل منطقة الصورة، سيظهر حد على الصورة، وعند تحريك الماوس، ستتحرك الصورة وفقًا لذلك. بعد رفع الماوس، تختفي الحدود. يقوم البرنامج أولاً بوضع الصور في الحالتين في مخزنين مؤقتين. عند سحب الماوس، تتم إعادة رسم الصورة بنمط الماوس لأسفل بشكل مستمر في الموضع الجديد. وعندما يتم رفع الماوس، تتم إعادة رسم الصورة بنمط الماوس لأعلى .
import java.applet.*;import java.awt.*;imprt java.awt.image. * ;import javax.swing.*;import java.event.*;public class example7_6 Extends Applet{ Image /*init(; ) ، قم أولاً بتعريف كائن صورة وتعيين القيمة المرجعة لطريقة createImage()، ثم قم بإنشاء كائن Graphics وقم بتعيين بيئة رسومية له. أخيرًا، اسمح للكائن Graphics باستدعاء طريقة drawImage() لعرض الصورة. نظرًا لأن كائن الرسومات offScreenGc هنا كائن غير موجود على الشاشة، فلن تكون هناك صورة معروضة في نافذة التطبيق الصغير*/ public void init(){ myPicture = getImage(getCodeBase(), "myPic.JPG"); (size() .width, size().height); Graphics offScreenGc = offScreenImage.getGraphics(); BufferedDemo(myPicture); } /* المعلمة الرابعة لطريقة drawImage() هي تنفيذ واجهة ImageObserver في طريقة init()، تكون معلمة استدعاء طريقة drawImage() هي هذه، لذا يجب أن يحدد التطبيق الصغير imageUpdate. () طريقة*/ public boolean imageUpdate(Image img, int infoFlg, int x, int y, int w, int h){ if (infoFlg = ALLBITS){ // يشير إلى أن الصورة قد تم تحميلها بالكامل في الذاكرة repaint(); return false; // منع الخيط من استدعاء طريقة imageUpdate() مرة أخرى} else return true }}/*تتم عملية تنفيذ البرنامج يستدعي التطبيق الصغير طريقة drawImage ()، وستقوم طريقة drawImage () بإنشاء مؤشر ترابط يستدعي طريقة imageUpdate () في طريقة imageUpdate ()، يتم تحديد ما إذا كانت الصورة قد تم نقلها جزئيًا إلى الذاكرة. يستمر مؤشر الترابط الذي تم إنشاؤه في استدعاء طريقة imageUpdate() حتى تُرجع الطريقة خطأ. تتيح المعلمة infoFlg للتطبيق الصغير معرفة كيفية تحميل الصورة في الذاكرة. عندما يساوي infoFlg ALLBITS، فهذا يعني أنه تم تحميل الصورة بالكامل في الذاكرة. عندما تجد هذه الطريقة أن الصورة قد تم تحميلها بالكامل في الذاكرة، فإنها تقوم بتعيين imageLoaded إلى true وتستدعي طريقة repaint() لإعادة رسم نافذة التطبيق الصغير. تقوم الطريقة بإرجاع خطأ لمنع الخيط من استدعاء طريقة imageUpdate() مرة أخرى. */class BufferedDemo Extends JFrame{ public BufferedDemo(Image img){ this.getContentPane().add(new PicPanel(img)); setTile("عرض توضيحي لتقنية التخزين المؤقت"); setSize(300, 300); }} class PicPane يمتد JPanel Implements MouseListener, MouseMotionListener{ int x = 0, y = 0, dx = 0, cy = 0; BufferedImage bimg1, bimg2; bimg1 = new BufferedImage(img.getWidth(this), img.getHeight(this), BufferedImage.TYPE_INT_ARGB); createGraphics(); g2D1.drawImage(img, 0, 0, this); g2D2.drawImage(img, 0, 0, this); g2D2.drawRect(1, 1, img.getWidth(this) - 3, img.getHeight(this) - 3); } public void PaintComponent(Graphics g){ super.painComponent(g); (Graphics2D)g; if (upState) g2D.drawImage(bimg1, x, y, this); else g2D.drawImage(bimg2.x, y, this } public void mousePress(MouseEvent e){ if (e.getX () >= x && e.getX() < x + bimg1.getWidth(this) && e.getY() >= y&& e.getY() < y + bimg1.getHeight(this)){ upstate = false; y; repain(); } } public void mouseExited(MouseEvent e){} public void mouseClicked(MouseEvent) e){} public void mouseEntered(MouseEvent e){} public void MouseReleased(MouseEvent e){ this.setCursor(Cursor.getpreifiedCursor(Cursor.DEFAULT_CURSOR)); upState = true; } public void mouseMoved(MouseEvent e ){} public void mouseDragged(MouseEvent e){ if (!upState){ x = e.getX() - y = e.getY() - dy;
لإنشاء صورة مخزنة، يحتاج البرنامج إلى تقديم فئة BufferedImage في الحزمة java.awt.image. لإنشاء صورة مخزنة، قم باستدعاء الأسلوب createImage()، الذي يقوم بإرجاع كائن Image ثم تحويله إلى كائن BufferedImage. على سبيل المثال الكود:
BufferedImage bimage = (BufferedImage)this.createImage(this.getWidth(),this.getHeight());
يمكنك أيضًا استخدام طرق البناء التالية لإنشائه.
BufferedImage(int width,int High, int imageType);
المعلمة imageType هي نوع الصورة.
لاستخدام المخزن المؤقت لعرض صورة، تحتاج إلى إعداد الصورة في المخزن المؤقت أولاً، ثم عرض الصورة في المخزن المؤقت على الواجهة. يتطلب عرض الصور كائنات رسومية، والتي يمكن إنشاؤها من خلال الطرق التالية:
Graphics2D g2d = bimge.createGraphics();