Saya mencoba mengubah warna UIImage. Kode saya:
-(UIImage *)coloredImage:(UIImage *)firstImage withColor:(UIColor *)color {
UIGraphicsBeginImageContext(firstImage.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[color setFill];
CGContextTranslateCTM(context, 0, firstImage.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextSetBlendMode(context, kCGBlendModeCopy);
CGRect rect = CGRectMake(0, 0, firstImage.size.width, firstImage.size.height);
CGContextDrawImage(context, rect, firstImage.CGImage);
CGContextClipToMask(context, rect, firstImage.CGImage);
CGContextAddRect(context, rect);
CGContextDrawPath(context,kCGPathElementMoveToPoint);
UIImage *coloredImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return coloredImg;
}
Kode ini berfungsi, tetapi gambar yang diperoleh tidak sebaik seharusnya: batas piksel gambar yang dikembalikan terputus-putus dan tidak semulus pada gambar pertama saya. Bagaimana cara mengatasi masalah ini?
Jawaban:
Sejak iOS 7, ini adalah cara paling sederhana untuk melakukannya.
Objective-C:
Swift 2.0:
Swift 4.0:
Papan cerita:
Pertama, konfigurasikan gambar sebagai template (di bilah kanan - Render sebagai) di aset Anda. Kemudian warna gambar akan menjadi warna tint yang diterapkan.
sumber
theImageView.image? = (theImageView.image?.imageWithRenderingMode(.AlwaysTemplate))! theImageView.tintColor = UIColor.magentaColor()
img = [img imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; [button setTintColor:[UIColor redColor]]; [button setImage:img forState:UIControlStateNormal];
@Anish terima kasih!Ini adalah jawaban di atas, tetapi sedikit dipersingkat. Ini hanya mengambil gambar sebagai topeng dan tidak benar-benar "memperbanyak" atau mewarnai gambar.
Tujuan C:
Cepat:
sumber
UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
karena versi Anda hanya akan membuat grafik non retina.Cara lain untuk mewarnai gambar adalah dengan mengalikannya dengan warna konstan. Terkadang, ini lebih disukai karena tidak "mengangkat" nilai warna di area hitam; itu menjaga intensitas relatif pada gambar tetap sama. Menggunakan overlay sebagai tint cenderung meratakan kontras.
Ini kode yang saya gunakan:
Versi cepat
sumber
Di Swift 3.0
Di Swift 2.0
Selamat menikmati Anda para pionir Swift
sumber
Solusi Swift 4.2
sumber
Mulai dari iOS 10 Anda dapat menggunakan
UIGraphicsImageRenderer
:sumber
Jika Anda tidak harus melakukannya secara terprogram, Anda bisa melakukannya menggunakan Xcode UI.
Jika Anda membuka gambar di folder aset gambar, buka inspektur di sisi kanan dan ada tarik-turun "Render Sebagai" dengan opsi berikut:
Setelah Anda membuat pemilihan Template, Anda dapat mengubah tintColor gambar sesuka Anda - apakah itu menggunakan Xcode storyboard UI atau secara terprogram.
Lihat gambar ini:
sumber
Inilah adaptasi saya dari jawaban @ Anna. Dua poin penting di sini:
destinationIn
blending modeUIGraphicsBeginImageContextWithOptions(backgroundSize, false, UIScreen.main.scale)
untuk mendapatkan gambar yang halusKode di Swift 3 :
sumber
self
di dalam metode Anda dan hapus parameter gambar yang tidak perluBerdasarkan jawaban @ Anna dan saya menulis ulang untuk swift 2.2 dan menangani gambar dengan saluran alfa:
sumber
Kode Anna berfungsi dengan baik untuk menyalin UIImage.image di atas latar belakang .image berwarna dengan menggunakan kCGBlendModeNormal daripada kCGBlendModeMultiply. Misalnya,
self.mainImage.image = [self NormalImageByConstantColor: self.mainImage.image withColor: yourColor];
akan menempatkan konten mainImage.image di atas tint yourColor sambil mempertahankan opacity yourColor. Ini memecahkan masalah saya menempatkan warna latar belakang dengan opasitas di belakang gambar untuk disimpan ke Rol Kamera.sumber
Cepat 3:
sumber
Versi Swift 3.0 dari kode menakjubkan Anna:
sumber
Untuk iOS 13 dan yang lebih baru:
let redImage = image.withTintColor(.red, renderingMode: .alwaysTemplate)
sumber