Aplikasi saya mengunduh sekumpulan file gambar dari jaringan, dan menyimpannya ke disk iPhone lokal. Beberapa dari gambar tersebut berukuran cukup besar (lebarnya lebih dari 500 piksel, misalnya). Karena iPhone bahkan tidak memiliki layar yang cukup besar untuk menampilkan gambar dalam ukuran aslinya, saya berencana mengubah ukuran gambar menjadi sesuatu yang sedikit lebih kecil untuk menghemat ruang / kinerja.
Selain itu, beberapa gambar tersebut adalah JPEG dan tidak disimpan seperti pengaturan kualitas 60% biasanya.
Bagaimana saya bisa mengubah ukuran gambar dengan iPhone SDK, dan bagaimana saya bisa mengubah pengaturan kualitas gambar JPEG?
Cara termudah dan paling mudah untuk mengubah ukuran gambar Anda adalah ini
sumber
Metode di atas berfungsi dengan baik untuk gambar kecil, tetapi ketika Anda mencoba mengubah ukuran gambar yang sangat besar, Anda akan segera kehabisan memori dan merusak aplikasi. Cara yang jauh lebih baik adalah menggunakan
CGImageSourceCreateThumbnailAtIndex
untuk mengubah ukuran gambar tanpa mendekodekannya sepenuhnya terlebih dahulu.Jika Anda memiliki jalur ke gambar yang ingin Anda ubah ukurannya, Anda dapat menggunakan ini:
Lebih lengkapnya di sini .
sumber
CGImageSource
selain gambar dan pdf?inSampleSize
yang digunakan oleh decoder Android. Dan ini adalah satu-satunya jawaban yang memberikan cara untuk memperkecil gambar dengan cara yang efisien dalam memori.Cara terbaik untuk menskalakan gambar tanpa kehilangan rasio aspek (yaitu tanpa meregangkan gambar) adalah dengan menggunakan metode ini:
Tambahkan metode ini ke kelas Utility Anda sehingga Anda dapat menggunakannya di seluruh proyek Anda, dan mengaksesnya seperti ini:
Metode ini menangani penskalaan sambil mempertahankan rasio aspek. Ini juga menambahkan indentasi ke gambar jika gambar yang diperkecil memiliki lebar lebih dari tinggi (atau sebaliknya).
sumber
Jika Anda memiliki kendali atas server, saya sangat menyarankan mengubah ukuran sisi server gambar dengan ImageMagik . Mendownload gambar berukuran besar dan mengubah ukurannya di ponsel akan membuang banyak sumber daya berharga - bandwidth, baterai, dan memori. Semuanya langka di ponsel.
sumber
Saya mengembangkan solusi pamungkas untuk penskalaan gambar di Swift.
Anda dapat menggunakannya untuk mengubah ukuran gambar untuk diisi, mengisi aspek, atau menyesuaikan aspek ukuran yang ditentukan.
Anda dapat meratakan gambar ke tengah atau salah satu dari empat tepi dan empat sudut.
Dan juga Anda dapat memangkas ruang ekstra yang ditambahkan jika rasio aspek gambar asli dan ukuran target tidak sama.
Ada contoh penerapan solusi ini di bawah.
Persegi panjang abu-abu adalah gambar situs target yang akan diubah ukurannya menjadi. Lingkaran biru dalam persegi panjang biru muda adalah gambarnya (saya menggunakan lingkaran karena mudah dilihat saat diskalakan tanpa mempertahankan aspek). Warna oranye terang menandai area yang akan dipangkas jika Anda lewat
trim: true
.Aspek pas sebelum dan sesudah penskalaan:
Contoh lain dari aspek kesesuaian :
Aspek pas dengan perataan atas:
Isi aspek :
Isi :
Saya menggunakan upscaling dalam contoh saya karena lebih mudah untuk didemonstrasikan tetapi solusi juga berfungsi untuk downscaling seperti yang dipermasalahkan.
Untuk kompresi JPEG Anda harus menggunakan ini:
Anda dapat melihat inti saya dengan taman bermain Xcode.
sumber
Untuk Swift 3, kode di bawah menskalakan gambar dengan mempertahankan rasio aspek. Anda dapat membaca lebih lanjut tentang ImageContext di dokumentasi Apple :
Untuk menggunakannya, panggil
resizeImage()
metode:sumber
Anda dapat menggunakan kode ini untuk menskalakan gambar dalam ukuran yang dibutuhkan.
sumber
Menurut sesi ini, iOS Memory Deep Dive , kami sebaiknya menggunakan
ImageIO
gambar yang diperkecil.UIImage
Buruknya menggunakan gambar downscale.Menggunakan
ImageIO
ImageIO dapat membaca ukuran gambar dan informasi metadata tanpa mengotori memori.
ImageIO dapat mengubah ukuran gambar hanya dengan biaya gambar yang diubah ukurannya.
Tentang Gambar di memori
UIGraphicsBeginImageContextWithOptions
selalu menggunakanSRGB
format rendering, yang menggunakan 4 byte per piksel.load -> decode -> render
3 fase.UIImage
mahal untuk ukuran dan ukuranUntuk gambar berikut, jika menggunakan
UIGraphicsBeginImageContextWithOptions
kita hanya perlu 590KB untuk memuat gambar, sedangkan kita membutuhkan2048 pixels x 1536 pixels x 4 bytes per pixel
= 10MB saat decodingsementara
UIGraphicsImageRenderer
, diperkenalkan di iOS 10, secara otomatis akan memilih format grafik terbaik di iOS12. Artinya, Anda dapat menghemat 75% memori dengan menggantinyaUIGraphicsBeginImageContextWithOptions
denganUIGraphicsImageRenderer
jika Anda tidak membutuhkan SRGB.Ini adalah artikel saya tentang gambar iOS di memori
atau
sumber
Masalah yang mungkin terjadi pada tampilan retina adalah skala gambar diatur oleh ImageCapture atau lebih. Fungsi pengubahan ukuran di atas tidak akan mengubahnya. Dalam kasus ini, pengubahan ukuran tidak akan berfungsi dengan benar.
Pada kode di bawah ini, skala diatur ke 1 (tidak diskalakan) dan gambar yang dikembalikan memiliki ukuran yang Anda harapkan. Ini dilakukan dalam
UIGraphicsBeginImageContextWithOptions
panggilan.sumber
Menambah banyak jawaban di sini, tetapi saya telah mencari solusi yang mengubah ukuran berdasarkan ukuran file, daripada dimensi.
Ini akan mengurangi dimensi dan kualitas gambar hingga mencapai ukuran yang Anda tetapkan.
Kredit untuk skala berdasarkan jawaban ukuran
sumber
Versi Swift
sumber
Saya akhirnya menggunakan teknik Brads untuk membuat
scaleToFitWidth
metodeUIImage+Extensions
jika itu berguna bagi siapa pun ...lalu dimanapun Anda suka
#import "UIImage+Extensions.h"
UIImage *newImage = [image scaleToFitWidth:100.0f];
Juga perlu dicatat, Anda dapat memindahkan ini lebih jauh ke dalam
UIView+Extensions
kelas jika Anda ingin merender gambar dari UIViewsumber
Saya hanya ingin menjawab pertanyaan itu untuk programmer Cocoa Swift. Fungsi ini mengembalikan NSImage dengan ukuran baru. Anda dapat menggunakan fungsi itu seperti ini.
sumber
Jika gambar Anda ada di direktori dokumen, Tambahkan ekstensi URL ini :
Pemakaian:
Catatan: - Ubah <LocalImagePath.jpg> dengan jalur gambar jpg lokal Anda.
sumber
Jika ada yang masih mencari opsi yang lebih baik
sumber
sumber
Untuk mengubah ukuran gambar, saya memiliki hasil (grafis) yang lebih baik dengan menggunakan fungsi ini sebagai ganti DrawInRect:
Rasio aspek ditangani secara otomatis
sumber