2014-02-20 63 views
1

在我的應用程序中,我有一個imageViewimageView中的圖像應該給一些效果,如棕褐色,黑色和白色。
要做到棕褐色效果我用下面的代碼,在iOS中使用棕褐色圖像效果時出錯?

-(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; 
} 

它可以正常使用,但僅限於PNG圖片,當我使用.jpg圖像,它只是顯示爲imageView黑色視圖。任何幫助將不勝感激

+0

JPG不支持每個像素最多32個位是24位,它們是分別用於R,G,B(無alpha),因爲你沒有8位不要將數據轉換爲RGBA,請進行以下更改:int imagWidth = image.size.width; int imageheight = image.size.height; NSInteger myDataLength = imagWidth * imageheight * 3; for(int i = 0; i Paulo

回答

1

使用核心的圖像處理,

-(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]]; 

}

0

使用CGImageCreateWithJPEGDataProvider從JPEG得到位圖:

​​3210

不能使用JPEG編碼的圖像像普通的RGB。所以,首先用CGImageCreateWithJPEGDataProvider解碼它。

+0

可以請你簡要 – Chandru

+0

我已經發布了用於JPEG圖像的代碼。對於PNG使用現在可用的解決方案。 –

+0

它在UInt8崩潰*數據ebad訪問 – Chandru

0

我懷疑你正在處理非RGBA格式的數據....一個人沒有一個Alpha通道的JPG。與其處理數據的複雜性,我建議你考慮使用核心圖像過濾器,我已經使用它們與JPG和PNG沒有任何問題。

有各種各樣的核心圖像過濾器包括一個爲棕褐色,另一個用於灰度/黑白這裏是棕褐色的代碼:

-(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上CoreImage蘋果文檔是好的,我建議你閱讀它。

+0

JPG使用8位灰度圖像或24位顏色 - 這是r,g和藍色的8位。你的例程假設一個被PNG使用的稱爲RBGA8888的32位彩色格式。 (注意灰度PNG也存在)。我相信有一些例程可以檢查CGColorSpaceRef是否正在使用或將其轉換爲RGBA,以便您的例程可以正常工作,但爲什麼要處理像CoreImage這樣的更高級別的框架已經完成了所有繁重的工作。 – Paulo

相關問題