ฉันเห็นคำตอบมากมายไม่ตอบคำถามทั้งสามข้อของ OP
1)คำเกี่ยวกับประสิทธิภาพ: อาร์เรย์ไบต์ไม่มีประสิทธิภาพเว้นแต่คุณสามารถใช้พิกเซลไบต์ที่แน่นอนซึ่งตรงกับอะแดปเตอร์จอแสดงผลความละเอียดปัจจุบันและความลึกของสี
เพื่อให้ได้ประสิทธิภาพการวาดที่ดีที่สุดเพียงแปลงภาพของคุณเป็น BufferedImage ซึ่งสร้างขึ้นด้วยประเภทที่สอดคล้องกับการกำหนดค่ากราฟิกปัจจุบันของคุณ ดู createCompatibleImage ที่https://docs.oracle.com/javase/tutorial/2d/images/drawonimage.html
ภาพเหล่านี้จะถูกเก็บไว้โดยอัตโนมัติในหน่วยความจำการ์ดแสดงผลหลังจากการวาดภาพไม่กี่ครั้งไม่มีความพยายามเขียนโปรแกรมใด ๆ (นี้เป็นมาตรฐานในการสวิงตั้งแต่ Java 6) และดังนั้นจึงวาดภาพที่เกิดขึ้นจริงจะใช้จำนวนเล็กน้อยของเวลา - ถ้าคุณไม่ได้เปลี่ยนภาพ .
การเปลี่ยนแปลงภาพจะมาพร้อมกับการโอนหน่วยความจำเพิ่มเติมระหว่างหน่วยความจำหลักและหน่วยความจำ GPU ซึ่งช้า หลีกเลี่ยงการ "redrawing" รูปภาพลงใน BufferedImage ดังนั้นหลีกเลี่ยงการทำ getPixel และ setPixel เลย
ตัวอย่างเช่นหากคุณกำลังพัฒนาเกมแทนที่จะวาดนักแสดงเกมทั้งหมดไปที่ BufferedImage และจากนั้นไปที่ JPanel จะเร็วกว่ามากที่จะโหลดนักแสดงทั้งหมดเป็น BufferedImages และวาดทีละตัวในรหัส JPanel ของคุณที่ ตำแหน่งที่เหมาะสม - วิธีนี้ไม่มีการถ่ายโอนข้อมูลเพิ่มเติมระหว่างหน่วยความจำหลักและหน่วยความจำ GPU ยกเว้นการถ่ายโอนภาพเริ่มต้นสำหรับการแคช
ImageIcon จะใช้ BufferedImage ใต้ฝากระโปรง - แต่โดยทั่วไปการจัดสรร BufferedImage ด้วยโหมดกราฟิกที่เหมาะสมคือกุญแจและไม่มีความพยายามที่จะทำสิ่งนี้
2)วิธีปกติในการทำเช่นนี้คือการวาด BufferedImage ในวิธีการเขียนทับสีแทนส่วนประกอบของ JPanel แม้ว่าจาวาจะรองรับสินค้าจำนวนมากเช่นโซ่บัฟเฟอร์ที่ควบคุม VolatileImages ที่แคชไว้ในหน่วยความจำ GPU แต่ก็ไม่จำเป็นต้องใช้สิ่งเหล่านี้ตั้งแต่ Java 6 ซึ่งทำงานได้ดีพอสมควรโดยไม่เปิดเผยรายละเอียดทั้งหมดของการเร่งความเร็วของ GPU
โปรดทราบว่าการเร่งความเร็ว GPU อาจไม่ทำงานสำหรับการทำงานบางอย่างเช่นการยืดภาพโปร่งแสง
3)อย่าเพิ่ม เพียงทาสีตามที่กล่าวไว้ข้างต้น:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
}
"การเพิ่ม" เข้าท่าถ้ารูปภาพเป็นส่วนหนึ่งของเลย์เอาต์ หากคุณต้องการสิ่งนี้เป็นภาพพื้นหลังหรือภาพเบื้องหน้าที่เติม JPanel เพียงแค่วาดด้วยสีส่วนประกอบ ถ้าคุณชอบการต้มส่วนประกอบ Swing ทั่วไปซึ่งสามารถแสดงภาพของคุณได้มันเป็นเรื่องเดียวกัน (คุณอาจใช้ JComponent และแทนที่วิธีการ paintComponent ของมัน) - แล้วเพิ่มสิ่งนี้ลงในเค้าโครงของส่วนประกอบ GUI
4)วิธีแปลง Array ให้เป็น Bufferedimage
การแปลงอาร์เรย์ไบต์ของคุณเป็น PNG จากนั้นโหลดค่อนข้างมากทรัพยากร วิธีที่ดีกว่าคือการแปลงอาร์เรย์ไบต์ที่มีอยู่ของคุณเป็น BufferedImage
สำหรับที่: อย่าใช้สำหรับลูปและคัดลอกพิกเซล มันช้ามาก แทน:
- เรียนรู้โครงสร้างไบต์ที่ต้องการของ BufferedImage (ทุกวันนี้มันปลอดภัยที่จะสมมติว่า RGB หรือ RGBA ซึ่งเป็น 4 ไบต์ต่อพิกเซล)
- เรียนรู้ scanline และ scanize ในการใช้งาน (เช่นคุณอาจมีภาพกว้าง 142 พิกเซล - แต่ในชีวิตจริงที่จะถูกเก็บไว้เป็นอาร์เรย์ไบต์กว้าง 256 พิกเซลเนื่องจากมันเร็วกว่าในการประมวลผลและปิดบังพิกเซลที่ไม่ได้ใช้โดยฮาร์ดแวร์ GPU )
- จากนั้นเมื่อคุณสร้างอาเรย์ตามหลักการเหล่านี้เมธอดอาร์เรย์ setRGB ของ BufferedImage สามารถคัดลอกอาเรย์ของคุณไปยัง BufferedImage
MemoryImageSource
แปลงให้เป็นรูปแบบ JPEG หรือ PNG แล้วอ่านด้วยImageIO
คำตอบที่แนะนำมากที่สุด คุณสามารถได้รับImage
จากการMemoryImageSource
สร้างด้วยข้อมูลภาพของคุณโดยใช้createImage
และแสดงตามที่แนะนำในหนึ่งในคำตอบ