Apakah ada cara lain selain menggunakan ImageIO.read untuk mendapatkan tinggi dan lebar gambar?
Karena saya mengalami masalah yang mengunci utas.
at com.sun.medialib.codec.jpeg.Decoder.njpeg_decode(Native Method)
at com.sun.medialib.codec.jpeg.Decoder.decode(Decoder.java:87)
at com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader.decode(CLibJPEGImageReader.java:73)
- locked <0xd96fb668> (a com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader)
at com.sun.media.imageioimpl.plugins.clib.CLibImageReader.getImage(CLibImageReader.java:320)
- locked <0xd96fb668> (a com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader)
at com.sun.media.imageioimpl.plugins.clib.CLibImageReader.read(CLibImageReader.java:384)
- locked <0xd96fb668> (a com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader)
at javax.imageio.ImageIO.read(ImageIO.java:1400)
at javax.imageio.ImageIO.read(ImageIO.java:1322)
Kesalahan ini hanya terjadi pada server aplikasi Sun dan oleh karena itu saya curiga bahwa ini adalah bug Sun.
java
javax.imageio
est perak
sumber
sumber
jstack
).Jawaban:
Ini sesuatu yang sangat sederhana dan praktis.
sumber
Ini adalah penulisan ulang postingan bagus dari @Kay, yang menampilkan IOException dan memberikan jalan keluar awal:
Saya kira perwakilan saya tidak cukup tinggi untuk masukan saya dianggap layak sebagai balasan.
sumber
javax.imageio.ImageIO.getImageReadersByMIMEType(mimeType)
jika Anda ingin memastikan jenis filenya?.close()
streaming sebelum kembali? jika tidak, Anda membiarkan aliran terbukaorg.apache.commons.io.FilenameUtils#getExtension
untuk menggunakan untuk mendeteksi ekstensi nama file.Saya telah menemukan cara lain untuk membaca ukuran gambar (lebih umum). Anda dapat menggunakan kelas ImageIO bekerjasama dengan ImageReaders. Berikut ini contoh kode:
Perhatikan bahwa getFileSuffix adalah metode yang mengembalikan ekstensi jalur tanpa "." jadi misal: png, jpg dll. Contoh implementasinya adalah:
Solusi ini sangat cepat karena hanya ukuran gambar yang dibaca dari file dan bukan keseluruhan gambar. Saya mengujinya dan tidak ada perbandingan dengan kinerja ImageIO.read. Saya berharap seseorang akan merasakan manfaatnya.
sumber
getFileSuffix()
mengandung jika yang tidak perlu dan inisialisasi dengannull
bukanlah ide yang baik dalam kasus ini.ImageIO.read()
sepenuhnya keluar dari air, baik dalam hal waktu CPU dan penggunaan memori.Saya mencoba menguji kinerja menggunakan beberapa dari berbagai pendekatan yang terdaftar. Sulit untuk melakukan pengujian yang ketat karena banyak faktor yang memengaruhi hasilnya. Saya menyiapkan dua folder, satu dengan 330 file jpg dan satu lagi dengan 330 file png. Ukuran file rata-rata adalah 4Mb dalam kedua kasus. Lalu saya menelepon getDimension untuk setiap file. Setiap implementasi metode getDimension dan setiap jenis gambar diuji secara terpisah (proses terpisah). Berikut waktu eksekusi yang saya dapat (angka pertama untuk jpg, angka kedua untuk png):
Jelas bahwa beberapa metode memuat seluruh file untuk mendapatkan dimensi sementara yang lain mendapatkan hanya dengan membaca beberapa informasi header dari gambar. Saya rasa angka-angka ini mungkin berguna ketika kinerja aplikasi sangat penting.
Terima kasih semuanya atas kontribusinya pada utas ini - sangat membantu.
sumber
Anda dapat memuat data biner jpeg sebagai file dan mengurai sendiri header jpeg. Yang Anda cari adalah header 0xFFC0 atau Start of Frame:
Untuk info lebih lanjut tentang tajuk, lihat entri jpeg wikipedia atau saya mendapat info di atas di sini .
Saya menggunakan metode yang mirip dengan kode di bawah ini yang saya dapatkan dari posting ini di forum matahari:
}
sumber
==192
itu harus memeriksa nomor 192-207, kecuali 196, 200 dan 204.com.drewnoakes.metadata-extractor
perpustakaan untuk mengekstrak header ini dengan mudahCara sederhana:
sumber
Masalah dengan ImageIO.read adalah sangat lambat. Yang perlu Anda lakukan adalah membaca header gambar untuk mendapatkan ukurannya.
ImageIO.getImageReader
adalah kandidat yang sempurna.Ini adalah contoh Groovy, tetapi hal yang sama berlaku untuk Java
Performanya sama dengan menggunakan pustaka java SimpleImageInfo.
https://github.com/cbeust/personal/blob/master/src/main/java/com/beust/SimpleImageInfo.java
sumber
getReaderByFormat
?Anda dapat menggunakan Toolkit, tidak perlu ImageIO
Jika Anda tidak ingin menangani pemuatan gambar lakukan
sumber
Anda bisa mendapatkan lebar dan tinggi gambar dengan objek BufferedImage menggunakan java.
sumber
Untuk mendapatkan Gambar Buffered dengan ImageIO.read adalah metode yang sangat berat, karena ini membuat salinan lengkap gambar yang tidak terkompresi di memori. Untuk png Anda juga dapat menggunakan pngj dan kode:
sumber
Setelah berjuang dengan
ImageIO
banyak di tahun-tahun terakhir, saya pikir Andrew Taylor 's solusi adalah jauh kompromi terbaik (cepat: tidak menggunakanImageIO#read
, dan serbaguna). Terima kasih sobat!!Tetapi saya sedikit frustasi karena dipaksa untuk menggunakan file lokal (File / String), terutama dalam kasus di mana Anda ingin memeriksa ukuran gambar yang berasal dari, katakanlah, permintaan multipart / form-data di mana Anda biasanya mengambil
InputPart
/InputStream
's. Jadi saya segera membuat varian yang menerimaFile
,InputStream
danRandomAccessFile
, berdasarkan kemampuanImageIO#createImageInputStream
untuk melakukannya.Tentu saja, metode dengan
Object input
, mungkin hanya tetap privat dan Anda harus membuat metode polimorfik sebanyak yang diperlukan, memanggil yang ini. Anda juga dapat menerimaPath
withPath#toFile()
danURL
withURL#openStream()
sebelum meneruskan ke metode ini:sumber
Jadi sayangnya, setelah mencoba semua jawaban dari atas, saya tidak berhasil membuat mereka bekerja setelah waktu yang tak kenal lelah mencoba. Jadi saya memutuskan untuk melakukan peretasan yang sebenarnya sendiri dan saya melakukannya untuk saya. Saya percaya ini akan bekerja dengan sempurna untuk Anda juga.
Saya menggunakan metode sederhana ini untuk mendapatkan lebar gambar yang dihasilkan oleh aplikasi dan belum diunggah nanti untuk verifikasi:
Pls. perhatikan: Anda harus mengaktifkan izin dalam manifes untuk penyimpanan akses.
/ Saya membuatnya statis dan memasukkan kelas Global saya sehingga saya dapat mereferensikan atau mengaksesnya dari satu sumber saja dan jika ada modifikasi, semuanya harus dilakukan di satu tempat. Hanya mempertahankan konsep KERING di java. (bagaimanapun) :) /
}
sumber
Untuk mendapatkan ukuran file emf tanpa EMF Image Reader Anda dapat menggunakan kode:
sumber