Saya memuat bitmap ke ImageView, dan melihat kesalahan ini. Saya mengumpulkan batas ini berkaitan dengan batas ukuran untuk tekstur perangkat keras OpenGL (2048x2048). Gambar yang saya perlu memuat adalah gambar pinch-zoom sekitar 4.000 piksel.
Saya sudah mencoba mematikan akselerasi perangkat keras dalam manifes, tetapi tidak ada sukacita.
<application
android:hardwareAccelerated="false"
....
>
Apakah mungkin memuat gambar yang lebih besar dari 2048 piksel ke dalam ImageView?
inSampleSize
pendekatan.Jawaban:
Semua rendering didasarkan pada OpenGL, jadi tidak Anda tidak dapat melampaui batas ini (
GL_MAX_TEXTURE_SIZE
tergantung pada perangkat, tetapi minimum adalah 2048x2048, sehingga gambar yang lebih rendah dari 2048x2048 akan sesuai).Dengan gambar besar seperti itu, jika Anda ingin memperbesar, dan di ponsel, Anda harus menyiapkan sistem yang mirip dengan apa yang Anda lihat di google maps misalnya. Dengan gambar terpecah menjadi beberapa bagian, dan beberapa definisi.
Atau Anda dapat memperkecil gambar sebelum menampilkannya (lihat jawaban user1352407 pada pertanyaan ini).
Dan juga, berhati-hatilah dengan folder tempat Anda meletakkan gambar, Android dapat secara otomatis memperbesar gambar. Silahkan lihat pada jawaban Pilot_51 ini di bawah pertanyaan ini.
sumber
Ini bukan jawaban langsung untuk pertanyaan (memuat gambar> 2048), tetapi solusi yang mungkin bagi siapa pun yang mengalami kesalahan.
Dalam kasus saya, gambar lebih kecil dari 2048 di kedua dimensi (tepatnya 1280x727) dan masalah ini secara khusus dialami pada Galaxy Nexus. Gambar ada di
drawable
folder dan tidak ada folder yang memenuhi syarat. Android menganggap drawable tanpa kualifikasi kepadatan adalah mdpi dan menskalakannya ke atas atau ke bawah untuk kepadatan lainnya, dalam hal ini ditingkatkan 2x untuk xhdpi. Memindahkan gambar pelakunya kedrawable-nodpi
untuk mencegah penskalaan menyelesaikan masalah.sumber
drawable
tersembunyidrawable-mdpi
. Ini juga menjelaskan mengapa spidol peta khusus saya tampak buruk (mereka ditingkatkan, kemudian diturunkan).Saya telah memperkecil gambar dengan cara ini:
sumber
ctx
artinya ini ?Alih-alih menghabiskan berjam-jam mencoba menulis / men-debug semua kode downsampling ini secara manual, mengapa tidak menggunakan
Picasso
? Itu dibuat untuk berurusan denganbitmaps
semua jenis dan / atau ukuran.Saya telah menggunakan satu baris kode ini untuk menghapus masalah "bitmap terlalu besar ...." saya :
sumber
Tambahan 2 atribut berikut di (
AndroidManifest.xml
) bekerja untuk saya:sumber
Mengubah file gambar ke
drawable-nodpi
folder daridrawable
folder bekerja untuk saya.sumber
drawable
folder secara otomatis.Saya menggunakan Picasso dan memiliki masalah yang sama. gambar terlalu besar setidaknya dalam ukuran, lebar atau tinggi. akhirnya saya menemukan solusinya di sini. Anda dapat menurunkan skala gambar besar sesuai dengan ukuran layar dan juga menjaga aspek rasio:
dan gunakan metode ini untuk memuat gambar oleh Picasso:
juga untuk kinerja yang lebih baik Anda dapat mengunduh gambar sesuai dengan lebar dan tinggi layar tampilan, bukan keseluruhan gambar:
lalu:
EDIT: getDisplaySize ()
display.getWidth()/getHeight()
sudah ditinggalkan. Alih-alihDisplay
digunakanDisplayMetrics
.sumber
BitmapRegionDecoder
lakukan triknya.Anda dapat mengesampingkan
onDraw(Canvas canvas)
, memulai Thread baru dan mendekode area yang terlihat oleh pengguna.sumber
Seperti yang ditunjukkan oleh Larcho, mulai dari API level 10, Anda dapat menggunakan
BitmapRegionDecoder
untuk memuat wilayah tertentu dari suatu gambar dan dengan itu, Anda dapat menyelesaikan untuk menampilkan gambar besar dalam resolusi tinggi dengan mengalokasikan dalam memori hanya wilayah yang dibutuhkan. Baru-baru ini saya mengembangkan lib yang menyediakan visualisasi gambar besar dengan penanganan gerakan sentuh. Kode sumber dan sampel tersedia di sini .sumber
Lihat level
Anda dapat menonaktifkan akselerasi perangkat keras untuk tampilan individual saat runtime dengan kode berikut:
myView.setLayerType (View.LAYER_TYPE_SOFTWARE, null);
sumber
Saya mengalami masalah yang sama, ini solusi saya. atur lebar gambar sama dengan lebar layar android dan kemudian timbang tingginya
Ini lebih baik untuk ukuran layar Android apa pun. beri tahu saya jika itu berhasil untuk Anda.
sumber
Perkecil gambar:
Gambar akan diperkecil pada ukuran reqHeight dan reqWidth. Seperti yang saya mengerti inSampleSize hanya mengambil kekuatan 2 nilai.
sumber
Gunakan pustaka Glide alih-alih langsung memuat ke tampilan gambar
Glide: https://github.com/bumptech/glide
sumber
Saya mencoba semua solusi di atas, satu demi satu, selama beberapa jam, dan sepertinya tidak ada yang berhasil! Akhirnya, saya memutuskan untuk mencari-cari contoh resmi tentang pengambilan gambar dengan kamera Android, dan menampilkannya. Contoh resmi (di sini ), akhirnya memberi saya satu-satunya metode yang berhasil. Di bawah ini saya menyajikan solusi yang saya temukan di aplikasi contoh itu:
sumber
CATATAN UNTUK MEREKA YANG INGIN MEMASANG GAMBAR UKURAN KECIL:
Solusi Pilot_51 (memindahkan gambar Anda ke
drawable-nodpi
folder) berfungsi, tetapi memiliki masalah lain: Itu membuat gambar TERLALU KECIL di layar kecuali gambar diubah ukurannya menjadi resolusi yang sangat besar (seperti 2000 x 3800) agar sesuai dengan layar - kemudian membuat aplikasi Anda lebih berat .SOLUSI : letakkan file gambar Anda di
drawable-hdpi
- Ini bekerja seperti pesona bagi saya.sumber
Menggunakan benar ditarik subfolder dipecahkan itu untuk saya. Solusi saya adalah untuk menempatkan gambar resolusi penuh saya (1920x1200) ke dalam ditarik-xhdpi folder, bukan ditarik folder.
Saya juga meletakkan gambar yang diperkecil (1280x800) ke drawable-hdpi folder .
Kedua resolusi ini cocok dengan program Nexus 7 tablet 2013 dan 2012 yang saya pemrograman. Saya juga menguji solusinya pada beberapa tablet lain.
sumber
Kode ini berfungsi
sumber