[英]Error using sepia image effect in iOS?
In my app, I am having an imageView
, the image in the imageView
should be give some effects like sepia, black and white. 在我的应用程序,我有一个imageView
,在图像imageView
应该给喜欢怀旧,黑白一定的影响。
To do sepia effect I used the following code, 为了实现棕褐色效果,我使用了以下代码,
-(UIImage*)makeSepiaScale:(UIImage*)image
{
CGImageRef cgImage = [image CGImage];
CGDataProviderRef provider = CGImageGetDataProvider(cgImage);
CFDataRef bitmapData = CGDataProviderCopyData(provider);
UInt8* data = (UInt8*)CFDataGetBytePtr(bitmapData);
int imagWidth = image.size.width;
int imageheight = image.size.height;
NSInteger myDataLength = imagWidth * imageheight * 4;
for (int i = 0; i < myDataLength; i+=4)
{
UInt8 r_pixel = data[i];
UInt8 g_pixel = data[i+1];
UInt8 b_pixel = data[i+2];
int outputRed = (r_pixel * .393) + (g_pixel *.769) + (b_pixel * .189);
int outputGreen = (r_pixel * .349) + (g_pixel *.686) + (b_pixel * .168);
int outputBlue = (r_pixel * .272) + (g_pixel *.534) + (b_pixel * .131);
if(outputRed>255)outputRed=255;
if(outputGreen>255)outputGreen=255;
if(outputBlue>255)outputBlue=255;
data[i] = outputRed;
data[i+1] = outputGreen;
data[i+2] = outputBlue;
}
CGDataProviderRef provider2 = CGDataProviderCreateWithData(NULL, data, myDataLength, NULL);
int bitsPerComponent = 8;
int bitsPerPixel = 32;
int bytesPerRow = 4 * imagWidth;
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
CGImageRef imageRef = CGImageCreate(imagWidth, imageheight, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider2, NULL, NO, renderingIntent);
CGColorSpaceRelease(colorSpaceRef); // YOU CAN RELEASE THIS NOW
CGDataProviderRelease(provider2); // YOU CAN RELEASE THIS NOW
CFRelease(bitmapData);
UIImage *sepiaImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef); // YOU CAN RELEASE THIS NOW
return sepiaImage;
}
It is working perfectly, but only for .png image, when I use .jpg images, it just displays a black colour view for the imageView
. 这是可以正常使用,但仅限于PNG图片,当我使用.jpg图像,它只是显示为黑色视图imageView
。 Any help will be appreciated 任何帮助将不胜感激
Use core image processing, 使用核心图像处理
-(void)makeSepiaScale
{
CIImage *beginImage =[[CIImage alloc]initWithImage:imageForView];
CIContext * context=[CIContext contextWithOptions:nil];
CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"
keysAndValues: kCIInputImageKey, beginImage,
@"inputIntensity", @0.8, nil];
CIImage *outImage = [filter outputImage];
CGImageRef cgimg=[context createCGImage:outImage fromRect:[outImage extent]];
[imageView setImage:[UIImage imageWithCGImage:cgimg]];
} }
Use CGImageCreateWithJPEGDataProvider to get the bitmap from JPEG: 使用CGImageCreateWithJPEGDataProvider从JPEG获取位图:
-(UIImage*)makeSepiaScale:(UIImage*)image {
CGImageRef cgJpegImage = [image CGImage];
CGDataProviderRef jpegProvider = CGImageGetDataProvider(cgJpegImage);
CGImageRef cgBitmapImage = CGImageCreateWithJPEGDataProvider(jpegProvider, nil, NO, kCGRenderingIntentRelativeColorimetric);
CGDataProviderRef bitmapProvider = CGImageGetDataProvider(cgBitmapImage);
CFDataRef bitmapData = CGDataProviderCopyData(bitmapProvider);
UInt8* data = (UInt8*)CFDataGetBytePtr(bitmapData);
// other code to make sepia effect
}
You can't use JPEG encoded image like plain RGB. 您不能使用像RGB一样的JPEG编码图像。 So, just decode it with CGImageCreateWithJPEGDataProvider first. 因此,只需先使用CGImageCreateWithJPEGDataProvider对其进行解码。
I suspect you are dealing with non RGBA format data .... JPG for one does not have an Alpha channel. 我怀疑您正在处理非RGBA格式的数据...。一个JPG没有Alpha通道。 Rather than deal with the intricacies of the data I suggest that you consider using Core Image filters, I've used them with jpg and PNG without any issues. 我建议您考虑使用Core Image过滤器,而不是处理数据的复杂性,而是将它们与jpg和PNG一起使用时没有任何问题。
There is a variety of Core Image filters including one for Sepia and another for grayscale / black and white here is the code for Sepia: Core Image过滤器种类繁多,其中一个用于棕褐色,另一个用于灰度/黑白,这是棕褐色的代码:
-(UIImage*)makeSepiaScale:(UIImage*)input_image output:(UIImage *)output
{
CIImage *cimage = [[CIImage alloc] initWithImage:input_image];
CIFilter *myFilter = [CIFilter filterWithName:@"CISepiaTone"];
[myFilter setDefaults];
[myFilter setValue:cimage forKey:@"inputImage"];
[myFilter setValue:[NSNumber numberWithFloat:0.8f] forKey:@"inputIntensity"];
CIImage *image = [myFilter outputImage];
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef cgImage = [context createCGImage:image fromRect:image.extent];
output = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
return (output);}
PS the Apple documentation on CoreImage is good, I suggest you read up on it. 附言:CoreImage上的Apple文档很好,我建议您仔细阅读。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.