Saya bisa melihat banyak jawaban, tidak benar-benar menjawab tiga pertanyaan OP.
1) Sebuah kata pada kinerja: array byte cenderung tidak efisien kecuali jika Anda dapat menggunakan pemesanan byte pixel yang tepat yang cocok dengan display adapter Anda resolusi saat ini dan kedalaman warna.
Untuk mencapai kinerja gambar terbaik, cukup konversikan gambar Anda ke BufferedImage yang dihasilkan dengan jenis yang sesuai dengan konfigurasi grafis Anda saat ini. Lihat createCompatibleImage di https://docs.oracle.com/javase/tutorial/2d/images/drawonimage.html
Gambar-gambar ini akan secara otomatis di-cache pada memori kartu tampilan setelah menggambar beberapa kali tanpa upaya pemrograman (ini adalah standar dalam Swing sejak Java 6), dan oleh karena itu gambar yang sebenarnya akan memakan waktu yang dapat diabaikan - jika Anda tidak mengubah gambar .
Mengubah gambar akan disertai dengan transfer memori tambahan antara memori utama dan memori GPU - yang lambat. Hindari "menggambar ulang" gambar menjadi BufferedImage karena itu, hindari melakukan getPixel dan setPixel dengan segala cara.
Misalnya, jika Anda mengembangkan game, alih-alih menarik semua aktor game ke BufferedImage dan kemudian ke JPanel, jauh lebih cepat untuk memuat semua aktor sebagai BufferedImages yang lebih kecil, dan menggambar mereka satu per satu dalam kode JPanel Anda di posisi yang tepat - dengan cara ini tidak ada transfer data tambahan antara memori utama dan memori GPU kecuali transfer awal gambar untuk caching.
ImageIcon akan menggunakan BufferedImage di bawah tenda - tetapi pada dasarnya mengalokasikan BufferedImage dengan mode grafis yang tepat adalah kuncinya, dan tidak ada upaya untuk melakukan ini dengan benar.
2) Cara yang biasa dilakukan adalah dengan menggambar BufferedImage dalam metode paintComponent dari JPanel yang diganti. Meskipun Java mendukung sejumlah barang tambahan yang bagus seperti rantai penyangga yang mengendalikan VolatileImages yang di-cache dalam memori GPU, tidak perlu menggunakan semua ini karena Java 6 yang melakukan pekerjaan yang cukup baik tanpa memaparkan semua detail akselerasi GPU ini.
Perhatikan bahwa akselerasi GPU mungkin tidak berfungsi untuk operasi tertentu, seperti peregangan gambar yang tembus cahaya.
3) Jangan menambahkan. Cukup cat seperti yang disebutkan di atas:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
}
"Menambahkan" masuk akal jika gambar merupakan bagian dari tata letak. Jika Anda membutuhkan ini sebagai gambar latar atau latar depan yang mengisi JPanel, cukup menggambar paintComponent. Jika Anda lebih suka membuat komponen Swing umum yang dapat menampilkan gambar Anda, maka itu adalah cerita yang sama (Anda dapat menggunakan JComponent dan mengganti metode paintComponentnya) - dan kemudian menambahkan ini ke tata letak komponen GUI Anda.
4) Cara mengonversi array menjadi Bufferedimage
Mengubah byte array Anda ke PNG, kemudian memuatnya cukup banyak sumber daya. Cara yang lebih baik adalah mengonversi array byte yang ada ke BufferedImage.
Untuk itu: jangan gunakan untuk loop dan menyalin piksel. Itu sangat lambat. Sebagai gantinya:
- mempelajari struktur byte yang disukai dari BufferedImage (saat ini aman untuk menganggap RGB atau RGBA, yaitu 4 byte per piksel)
- pelajari garis pemindaian dan scansize yang digunakan (mis. Anda mungkin memiliki gambar lebar 142 piksel - tetapi dalam kehidupan nyata itu akan disimpan sebagai array byte lebar 256 piksel karena lebih cepat memprosesnya dan menutupi piksel yang tidak digunakan oleh perangkat keras GPU )
- kemudian setelah Anda memiliki array array sesuai dengan prinsip-prinsip ini, metode array setRGB dari BufferedImage dapat menyalin array Anda ke BufferedImage.
MemoryImageSource
daripada mengubahnya menjadi format JPEG atau PNG dan kemudian membaca denganImageIO
seperti yang disarankan sebagian besar jawaban. Anda dapat memperolehImage
dari hasilMemoryImageSource
konstruksi dengan data gambar Anda dengan menggunakancreateImage
, dan menampilkan seperti yang disarankan dalam salah satu jawaban.