Saya memiliki UIImage
itu UIImageOrientationUp
(potret) yang ingin saya putar berlawanan arah jarum jam sebesar 90 derajat (ke lansekap). Saya tidak ingin menggunakan a CGAffineTransform
. Saya ingin piksel UIImage
untuk mengubah posisi. Saya menggunakan blok kode (ditunjukkan di bawah) yang awalnya dimaksudkan untuk mengubah ukuran UIImage
untuk melakukan ini. Saya menetapkan ukuran target sebagai ukuran saat ini UIImage
tetapi saya mendapatkan kesalahan:
(Kesalahan): CGBitmapContextCreate: byte / baris data yang tidak valid: harus setidaknya 1708 untuk 8 bit integer / komponen, 3 komponen, kCGImageAlphaPremultipliedLast.
(Saya tidak mendapatkan kesalahan setiap kali saya memberikan ukuran KECIL sebagai ukuran target BTW). Bagaimana saya bisa MEMUTARKAN UIImage
90 derajat CCW saya menggunakan fungsi inti grafis sambil mempertahankan ukuran saat ini?
-(UIImage*)reverseImageByScalingToSize:(CGSize)targetSize:(UIImage*)anImage
{
UIImage* sourceImage = anImage;
CGFloat targetWidth = targetSize.height;
CGFloat targetHeight = targetSize.width;
CGImageRef imageRef = [sourceImage CGImage];
CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);
CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef);
if (bitmapInfo == kCGImageAlphaNone) {
bitmapInfo = kCGImageAlphaNoneSkipLast;
}
CGContextRef bitmap;
if (sourceImage.imageOrientation == UIImageOrientationUp || sourceImage.imageOrientation == UIImageOrientationDown) {
bitmap = CGBitmapContextCreate(NULL, targetHeight, targetWidth, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);
} else {
bitmap = CGBitmapContextCreate(NULL, targetWidth, targetHeight, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);
}
if (sourceImage.imageOrientation == UIImageOrientationRight) {
CGContextRotateCTM (bitmap, radians(90));
CGContextTranslateCTM (bitmap, 0, -targetHeight);
} else if (sourceImage.imageOrientation == UIImageOrientationLeft) {
CGContextRotateCTM (bitmap, radians(-90));
CGContextTranslateCTM (bitmap, -targetWidth, 0);
} else if (sourceImage.imageOrientation == UIImageOrientationDown) {
// NOTHING
} else if (sourceImage.imageOrientation == UIImageOrientationUp) {
CGContextRotateCTM (bitmap, radians(90));
CGContextTranslateCTM (bitmap, 0, -targetHeight);
}
CGContextDrawImage(bitmap, CGRectMake(0, 0, targetWidth, targetHeight), imageRef);
CGImageRef ref = CGBitmapContextCreateImage(bitmap);
UIImage* newImage = [UIImage imageWithCGImage:ref];
CGContextRelease(bitmap);
CGImageRelease(ref);
return newImage;
}
sumber
Jawaban:
Bagaimana dengan sesuatu seperti:
sumber
Saya percaya cara termudah (dan utas juga aman) adalah dengan melakukan:
Catatan: Seperti yang dikatakan Brainware , ini hanya mengubah data orientasi gambar - data piksel tidak tersentuh. Untuk beberapa aplikasi, ini mungkin tidak cukup.
Atau di Swift:
sumber
let img = UIImage(cgImage: myImage!.cgImage!, scale: UIScreen.main.scale, orientation: .right)
Lihatlah kode Hardy Macia yang sederhana dan mengagumkan di: cutting-scaling-and-rotating-uiimages
Panggil saja
Terima kasih Hardy Macia!
Tajuk:
Karena tautannya mungkin mati, inilah kode lengkapnya
sumber
Seaneh tampaknya, kode berikut memecahkan masalah bagi saya:
sumber
Fungsi rotasi aman thread adalah sebagai berikut (bekerja jauh lebih baik):
sumber
UIImageOrientationDown
.Saya mengalami masalah dengan semua hal di atas, termasuk jawaban yang disetujui. Saya mengubah kategori Hardy kembali menjadi metode karena yang saya inginkan hanyalah memutar gambar. Berikut kode dan penggunaannya:
Dan penggunaannya:
Terima kasih hardy!
sumber
Putar Gambar 90 derajat (searah jarum jam / berlawanan arah jarum jam)
Panggilan fungsi -
Penerapan:
sumber
Jika Anda ingin menambahkan tombol putar foto yang akan terus memutar foto dalam peningkatan 90 derajat, ini dia. (
finalImage
adalah UIImage yang sudah dibuat di tempat lain.)sumber
Sederhana. Ubah saja bendera orientasi gambar.
sumber
Berikut ini adalah ekstensi Swift ke UIImage yang memutar gambar dengan sudut sembarang. Menggunakannya seperti ini:
let rotatedImage = image.rotated(byDegrees: degree)
. Saya menggunakan kode Objective-C di salah satu jawaban lain dan menghapus beberapa baris yang kami salah (memutar kotak barang) dan mengubahnya menjadi ekstensi untuk UIImage.sumber
Ekstensi UIImage Swift 3:
sumber
Versi Swift 4.2 dari jawaban RawMean :
sumber
Saya mencoba kode ini, ini berhasil, dan mengambil dari http://www.catamount.com/blog/1015/uiimage-extensions-for-cutting-scaling-and-rotating-uiimages/
sumber
Perubahan kecil ke jawaban lain yang didasarkan pada kode Hardy Macia. Tidak perlu membuat keseluruhan
UIView
objek hanya untuk menghitung persegi panjang pembatas dari gambar yang diputar. Cukup terapkan transformasi rotate ke kotak menggunakan gambarCGRectApplyAffineTransform
.sumber
"tint uiimage grayscale" tampaknya menjadi Google-Fu yang sesuai untuk ini
langsung saya dapatkan:
https://discussions.apple.com/message/8104516?messageID=8104516ꩄ
https://discussions.apple.com/thread/2751445?start=0&tstart=0
Bagaimana saya mewarnai gambar secara terprogram pada iPhone?
sumber
Saya suka keanggunan sederhana dari
Peter Sarnowski
jawaban, tetapi dapat menyebabkan masalah ketika Anda tidak dapat mengandalkanEXIF
metadata dan sejenisnya. Dalam situasi di mana Anda perlu memutar data gambar aktual, saya akan merekomendasikan sesuatu seperti ini:Kode di atas mengambil gambar yang orientasinya
Landscape
(tidak ingat apakah ituLandscape Left
atauLandscape Right
) dan mengubahnya menjadiPortrait
. Ini adalah contoh yang dapat dimodifikasi untuk kebutuhan Anda.Argumen kunci yang harus Anda mainkan adalah di
CGContextRotateCTM(context, M_PI_2)
mana Anda memutuskan seberapa banyak Anda ingin memutar, tetapi kemudian Anda harus memastikan gambar masih menarik di layar menggunakanCGContextTranslateCTM(context, 0, -640)
. Bagian terakhir ini cukup penting untuk memastikan Anda melihat gambar dan bukan layar kosong.Untuk info lebih lanjut, periksa sumbernya .
sumber
resize-a-uiimage-the-right-way menjelaskan beberapa masalah yang dimiliki oleh banyak contoh kode, dan memiliki beberapa cuplikan kode untuk membantu menangani UIImages - metode pembantu pribadi di UIImage + resize.m menerima transformasi untuk memungkinkan rotasi, jadi Anda hanya perlu memaparkannya sebagai antarmuka publik.
Ini adalah lisensi dari file itu:
sumber
Ada kategori UIImage yang sangat efisien bernama NYXImagesKit. Ia menggunakan vDSP, CoreImage dan vImage secepat mungkin. Ini memiliki kategori UIImage + Rotating yang menyelamatkan hari saya :)
https://github.com/Nyx0uf/NYXImagesKit
sumber
Untuk Swift: Ini adalah ekstensi sederhana ke UIImage:
( Sumber )
Gunakan dengan:
Yang pertama akan memutar gambar dan flip jika flip diatur ke true.
sumber