Saya punya beberapa kode yang mengubah ukuran gambar sehingga saya bisa mendapatkan potongan skala dari pusat gambar - saya menggunakan ini untuk mengambil UIImage
dan mengembalikan representasi persegi kecil dari gambar, mirip dengan apa yang terlihat dalam tampilan album dari aplikasi Foto. (Saya tahu saya bisa menggunakan UIImageView
dan menyesuaikan mode krop untuk mencapai hasil yang sama, tetapi gambar-gambar ini kadang-kadang ditampilkan di UIWebViews
).
Saya sudah mulai memperhatikan beberapa crash dalam kode ini dan saya agak bingung. Saya punya dua teori berbeda dan saya bertanya-tanya apakah keduanya ada di pangkalan.
Teori 1) Saya mencapai pemangkasan dengan menggambar ke dalam konteks gambar di luar layar dari ukuran target saya. Karena saya ingin bagian tengah gambar, saya mengatur CGRect
argumen yang diteruskandrawInRect
ke sesuatu yang lebih besar daripada batas konteks gambar saya. Saya berharap ini adalah halal, tetapi apakah saya malah mencoba mengambil alih memori lain yang seharusnya tidak saya sentuh?
Teori 2) Saya melakukan semua ini di utas latar belakang. Saya tahu ada bagian dari UIKit yang terbatas pada utas utama. Saya berasumsi / berharap bahwa menggambar ke tampilan offscreen bukan salah satunya. Apakah aku salah?
(Oh, betapa aku merindukan NSImage's drawInRect:fromRect:operation:fraction:
metode.)
Jawaban:
Pembaruan 2014-05-28: Saya menulis ini ketika iOS 3 atau lebih adalah hal baru yang panas, saya yakin ada cara yang lebih baik untuk melakukan ini sekarang, mungkin built-in. Seperti yang banyak orang sebutkan, metode ini tidak memperhitungkan rotasi; baca beberapa jawaban tambahan dan sebarkan cinta upvote sekitar untuk menjaga respon terhadap pertanyaan ini bermanfaat bagi semua orang.
Tanggapan asli:
Saya akan menyalin / menempelkan respons saya ke pertanyaan yang sama di tempat lain:
Tidak ada metode kelas sederhana untuk melakukan ini, tetapi ada fungsi yang dapat Anda gunakan untuk mendapatkan hasil yang diinginkan:
CGImageCreateWithImageInRect(CGImageRef, CGRect)
akan membantu Anda.Berikut ini contoh singkat menggunakannya:
sumber
imageOrientation
diatur ke apa pun kecuali ke atas,CGImage
diputar dengan memperhatikanUIImage
dan persegi panjang pemangkasan akan salah. Anda dapat memutar persegi panjang pemangkasan sesuai, tetapi yang baru dibuatUIImage
akanimageOrientation
naik, sehingga dipotongCGImage
akan diputar di dalamnya.[UIImage imageWithCGImage:imageRef scale:largeImage.scale orientation:largeImage.imageOrientation];
Untuk memotong gambar retina dengan tetap menjaga skala dan orientasi yang sama, gunakan metode berikut dalam kategori UIImage (iOS 4.0 dan lebih tinggi):
sumber
self.scale
, bukan?CGImageRelease(imageRef);
ARC diaktifkan?Anda dapat membuat kategori UIImage dan menggunakannya di mana pun Anda butuhkan. Berdasarkan tanggapan HitScans dan komentar di bawahnya.
Anda dapat menggunakannya dengan cara ini:
sumber
[[UIScreen mainScreen] scale]
begituself.scale
? Skala gambar mungkin tidak sama dengan skala layar.No visible @interface for 'UIImage' declares the selector 'crop'
meskipun saya meletakkan file kategori .h dan .m di proyek saya dan mengimpor .h di kelas saya menggunakan kategori. Ada ide?Versi Swift 3
dengan bantuan fungsi jembatan ini
CGRectMake
->CGRect
(kredit untuk jawaban ini dijawab oleh@rob mayoff
):Penggunaannya adalah:
Keluaran:
sumber
guard
baris pertama jikaUIImage.CGImage
kembalinil
dan mengapa digunakanvar
saatlet
bekerja dengan sempurna.cropping(to:)
sangat hati-hati. HasilnyaCGImage
memegang referensi kuat ke yang lebih besarCGImage
dari yang dipotong. Jadi, jika Anda ingin hanya berpegang pada gambar yang dipangkas dan tidak membutuhkan yang asli, lihat solusi lainnya.right
maka cgImage harus diputar sebanyak 90 derajat, maka crop rect harus diputar jugaIni adalah implementasi crop UIImage saya yang mematuhi properti imageOrientation. Semua orientasi diuji secara menyeluruh.
sumber
implicit declaration of function 'rad' is invalid in c99
dapat dihapus dengan mengganti: rad (90), rad (-90), rad (-180) -> M_PI_2, -M_PI_2, -_M_PIcontains undefined reference for architecture armv7
Apakah saya kehilangan perpustakaan? CoreGraphics diimpor.Kepala: semua jawaban ini menganggap
CGImage
objek gambar yang dikembalikan.image.CGImage
dapat mengembalikan nol, jikaUIImage
didukung olehCIImage
, yang akan terjadi jika Anda membuat gambar ini menggunakan aCIFilter
.Dalam hal ini, Anda mungkin harus menggambar gambar dalam konteks baru, dan mengembalikan gambar itu ( lambat ).
sumber
Tidak ada jawaban di sini yang menangani semua masalah skala dan rotasi 100% dengan benar. Berikut adalah sintesis dari semua yang dikatakan sejauh ini, terbaru pada iOS7 / 8. Ini dimaksudkan untuk dimasukkan sebagai metode dalam kategori di UIImage.
sumber
awolf
Jawaban versi cepat , yang bekerja untuk saya:sumber
Sebagian besar respons yang saya lihat hanya berkaitan dengan posisi (0, 0) untuk (x, y). Ok itu satu kasus tetapi saya ingin operasi tanam saya terpusat. Apa yang membuat saya perlu waktu untuk mencari tahu adalah garis mengikuti komentar WTF.
Mari kita ambil contoh gambar yang diambil dengan orientasi potret:
Semoga masuk akal! Jika tidak, coba nilai yang berbeda Anda akan melihat bahwa logika terbalik ketika harus memilih x, y, lebar, dan tinggi yang tepat untuk cropRect Anda.
sumber
swift3
sumber
Ekstensi cepat
sumber
Solusi terbaik untuk memotong UIImage di Swift , dalam hal presisi, penskalaan piksel ...:
Instruksi yang digunakan untuk memanggil fungsi ini:
Catatan: inspirasi kode sumber awal yang ditulis dalam Objective-C telah ditemukan di blog "Cocoanetics".
sumber
Cuplikan kode di bawah ini mungkin membantu.
sumber
Terlihat sedikit aneh tapi berfungsi dengan baik dan mempertimbangkan orientasi gambar:
sumber
Swift 5:
sumber
sumber
sumber
Di iOS9.2SDK, saya menggunakan metode di bawah ini untuk mengkonversi frame dari UIView ke UIImage
sumber
Pembaruan Swift 2.0 (
CIImage
kompatibilitas)Memperluas Jawaban Maxim tetapi berfungsi jika gambar Anda juga
CIImage
didasarkan.sumber
Berikut ini adalah versi Swift 3 yang diperbarui berdasarkan jawaban Mie
sumber
Ikuti Jawaban dari @Arne. Saya Hanya memperbaiki ke fungsi Kategori. letakkan di Kategori UIImage.
sumber
Saya tidak puas dengan solusi lain karena mereka mengambil beberapa waktu (menggunakan lebih banyak daya daripada yang diperlukan) atau memiliki masalah dengan orientasi. Berikut adalah apa yang saya gunakan untuk croppedImage persegi berskala dari gambar UIImage *.
sumber
Saya menggunakan metode di bawah ini.
}
sumber
Lihatlah https://github.com/vvbogdan/BVCropPhoto
sumber