ios:改变UIImage的颜色
我正在开发一个Iphone应用程序。
我有PNG图片代表符号。 符号都是黑色的,透明的背景。
有什么办法可以把黑色变成另一种吗? 我正在寻找的东西,可以帮助我select我想要的颜色,当使用符号(在UIImage),我可以让他们看起来是我select的颜色。
我search了四周,发现一个名为OpenCV的框架,可以操纵图像,但我不能找出如何重新着色图片。
任何帮助和build议,不胜感激。
谢谢
嗨,你想改变删除/一个特定的颜色意味着使用下面的类别….
.h文件:
#import <UIKit/UIKit.h> @interface UIImage (Color) + (UIImage*)setBackgroundImageByColor:(UIColor *)backgroundColor withFrame:(CGRect )rect; + (UIImage*) replaceColor:(UIColor*)color inImage:(UIImage*)image withTolerance:(float)tolerance; +(UIImage *)changeWhiteColorTransparent: (UIImage *)image; +(UIImage *)changeColorTo:(NSMutableArray*) array Transparent: (UIImage *)image; //resizing Stuff... + (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize; @end
.m文件
#import <QuartzCore/QuartzCore.h> #import "UIImage+Color.h" @implementation UIImage (Color) + (UIImage* )setBackgroundImageByColor:(UIColor *)backgroundColor withFrame:(CGRect )rect{ // tcv - temporary colored view UIView *tcv = [[UIView alloc] initWithFrame:rect]; [tcv setBackgroundColor:backgroundColor]; // set up a graphics context of button's size CGSize gcSize = tcv.frame.size; UIGraphicsBeginImageContext(gcSize); // add tcv's layer to context [tcv.layer renderInContext:UIGraphicsGetCurrentContext()]; // create background image now UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; // [tcv release]; } + (UIImage*) replaceColor:(UIColor*)color inImage:(UIImage*)image withTolerance:(float)tolerance { CGImageRef imageRef = [image CGImage]; NSUInteger width = CGImageGetWidth(imageRef); NSUInteger height = CGImageGetHeight(imageRef); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); NSUInteger bytesPerPixel = 4; NSUInteger bytesPerRow = bytesPerPixel * width; NSUInteger bitsPerComponent = 8; NSUInteger bitmapByteCount = bytesPerRow * height; unsigned char *rawData = (unsigned char*) calloc(bitmapByteCount, sizeof(unsigned char)); CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGColorSpaceRelease(colorSpace); CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); CGColorRef cgColor = [color CGColor]; const CGFloat *components = CGColorGetComponents(cgColor); float r = components[0]; float g = components[1]; float b = components[2]; //float a = components[3]; // not needed r = r * 255.0; g = g * 255.0; b = b * 255.0; const float redRange[2] = { MAX(r - (tolerance / 2.0), 0.0), MIN(r + (tolerance / 2.0), 255.0) }; const float greenRange[2] = { MAX(g - (tolerance / 2.0), 0.0), MIN(g + (tolerance / 2.0), 255.0) }; const float blueRange[2] = { MAX(b - (tolerance / 2.0), 0.0), MIN(b + (tolerance / 2.0), 255.0) }; int byteIndex = 0; while (byteIndex < bitmapByteCount) { unsigned char red = rawData[byteIndex]; unsigned char green = rawData[byteIndex + 1]; unsigned char blue = rawData[byteIndex + 2]; if (((red >= redRange[0]) && (red <= redRange[1])) && ((green >= greenRange[0]) && (green <= greenRange[1])) && ((blue >= blueRange[0]) && (blue <= blueRange[1]))) { // make the pixel transparent // rawData[byteIndex] = 0; rawData[byteIndex + 1] = 0; rawData[byteIndex + 2] = 0; rawData[byteIndex + 3] = 0; } byteIndex += 4; } UIImage *result = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)]; CGContextRelease(context); free(rawData); return result; } +(UIImage *)changeWhiteColorTransparent: (UIImage *)image { CGImageRef rawImageRef=image.CGImage; const float colorMasking[6] = {222, 255, 222, 255, 222, 255}; UIGraphicsBeginImageContext(image.size); CGImageRef maskedImageRef=CGImageCreateWithMaskingColors(rawImageRef, colorMasking); { //if in iphone CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 0.0, image.size.height); CGContextScaleCTM(UIGraphicsGetCurrentContext(), 1.0, -1.0); } CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, image.size.width, image.size.height), maskedImageRef); UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); CGImageRelease(maskedImageRef); UIGraphicsEndImageContext(); return result; } +(UIImage *)changeColorTo:(NSMutableArray*) array Transparent: (UIImage *)image { CGImageRef rawImageRef=image.CGImage; // const float colorMasking[6] = {222, 255, 222, 255, 222, 255}; const float colorMasking[6] = {[[array objectAtIndex:0] floatValue], [[array objectAtIndex:1] floatValue], [[array objectAtIndex:2] floatValue], [[array objectAtIndex:3] floatValue], [[array objectAtIndex:4] floatValue], [[array objectAtIndex:5] floatValue]}; UIGraphicsBeginImageContext(image.size); CGImageRef maskedImageRef=CGImageCreateWithMaskingColors(rawImageRef, colorMasking); { //if in iphone CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 0.0, image.size.height); CGContextScaleCTM(UIGraphicsGetCurrentContext(), 1.0, -1.0); } CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, image.size.width, image.size.height), maskedImageRef); UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); CGImageRelease(maskedImageRef); UIGraphicsEndImageContext(); return result; } + (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize { //UIGraphicsBeginImageContext(newSize); UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0); [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } @end
我通过这个代码将已删除的白色更改为透明。
电话会…
self.rawImage.image=[UIImage changeWhiteColorTransparent:originalStateImage];
我希望这个想法能帮助你
最简单和最短的:
在处理UIImageView
时候要这样做:
OBJ-C:
theImageView.image = [theImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; [theImageView setTintColor:[UIColor redColor]];
迅速:
let theImageView = UIImageView(image: UIImage(named:"foo")!.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)) theImageView.tintColor = UIColor.redColor()
嗨使用这个类别的文件来改变图像的整个颜色….
.h文件:
#import <UIKit/UIKit.h> @interface UIImage (AddtionalFunctionalities) //TintColor... - (UIImage *)imageWithTint:(UIColor *)tintColor; //scale and resize... -(UIImage*)scaleToSize:(CGSize)size; @end
.m文件:
#import "UIImage+AddtionalFunctionalities.h" @implementation UIImage (AddtionalFunctionalities) - (UIImage *)imageWithTint:(UIColor *)tintColor { // Begin drawing CGRect aRect = CGRectMake(0.f, 0.f, self.size.width, self.size.height); CGImageRef alphaMask; // // Compute mask flipping image // { UIGraphicsBeginImageContext(aRect.size); CGContextRef c = UIGraphicsGetCurrentContext(); // draw image CGContextTranslateCTM(c, 0, aRect.size.height); CGContextScaleCTM(c, 1.0, -1.0); [self drawInRect: aRect]; alphaMask = CGBitmapContextCreateImage(c); UIGraphicsEndImageContext(); } // UIGraphicsBeginImageContext(aRect.size); // Get the graphic context CGContextRef c = UIGraphicsGetCurrentContext(); // Draw the image [self drawInRect:aRect]; // Mask CGContextClipToMask(c, aRect, alphaMask); // Set the fill color space CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextSetFillColorSpace(c, colorSpace); // Set the fill color CGContextSetFillColorWithColor(c, tintColor.CGColor); UIRectFillUsingBlendMode(aRect, kCGBlendModeNormal); UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // Release memory CGColorSpaceRelease(colorSpace); CGImageRelease(alphaMask); return img; } -(UIImage*)scaleToSize:(CGSize)size { // Create a bitmap graphics context // This will also set it as the current context UIGraphicsBeginImageContext(size); // Draw the scaled image in the current context [self drawInRect:CGRectMake(0, 0, size.width, size.height)]; // Create a new image from current context UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); // Pop the current context from the stack UIGraphicsEndImageContext(); // Return our new scaled image return scaledImage; } @end
该方法调用将是:
self.outputImage.image=[sourceImage imageWithTint:[UIColor redColor]];
如果你想使用图像意味着使用这个:
self.outputImage.image=[sourceImage imageWithTint:[UIColor colorWithPatternImage:[UIImage imageNamed: @"red.jpg"]]];
我希望这会帮助你…
设置图像渲染模式,然后为了颜色目的使用tintcolor属性。
yourImageView.image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; [yourImageView setTintColor:[UIColor redColor]];
你可以创build存储UIImageView并改变UIview背景颜色的UIView。
UIView *viewForImage = ....; UIImageView *imageView = .....; ... [viewForImage addSubview: imageView]; [self.view addSubview:viewForImage]; ...
然后用于例如
[viewForImage setBackgroundColor: [UIColor redColor]];
对于使用objective-c来播放图像,主要是使用Quartz 2D / CoreGraphics框架。 我想这是你完成任务的最简单的方法。
链接到Quartz 2D指南在这里 ,指南是相当全面的。 只要看看填充位图的颜色。
另外我还有一些关于我的博客中的image processing的logging,你可以看看,这可能是有帮助的。 http://levonp.blogspot.de/2012/05/quartz-getting-diff-images-of-two.html
当然,你也可以使用OpenGL,OpenCV等更先进的东西。
一个非常简单的解决scheme来改变图像的颜色。 想法:UIImage和UIImageView的扩展。
Swift 3,Xcode 8.1。 https://stackoverflow.com/a/40884483/4488252
代码示例从我的答案(上面的链接):
// use extension UIImage newImageView = createNewImageView(x: 100) newImageView.image = UIImage(named: "Apple")?.imageWithColor(newColor: UIColor.blue) // use extension UIImageView newImageView = createNewImageView(x: 160) newImageView.image = UIImage(named: "Apple") newImageView.imageColor = UIColor.green