从我的服务器加载的图片在iPad应用程序上的颜色错误

时间:2016-05-08 17:28:51

标签: ios image ipad colors srgb

我正在开发一款iPad应用程序,可以呈现摄影师的照片。这些照片会上传到网络服务器上,并通过应用程序直接提供,下载并使用以下方法显示:

if([[NSFileManager defaultManager] fileExistsAtPath:[url path]]){
    CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
    CGImageRef cgImage = nil;
    if(source){
        cgImage = CGImageSourceCreateImageAtIndex(source, 0, (CFDictionaryRef)dict);
    }

    UIImage *retImage = [UIImage imageWithCGImage:cgImage];

    if(cgImage){
        CGImageRelease(cgImage);
    }
    if(source){
        CFRelease(source);
    }

    return retImage;
}

我可以观察到原始照片(从磁盘或Mac上的网络和摄影师的Mac上显示)和iPad上的照片颜色显示的严重变化(结果在应用程序中甚至在Safari中都是错误的。

经过一番搜索,我发现了一些帖子,解释了iDevices如何不使用嵌入式颜色配置文件,所以我发现我是这样的。使用以下信息保存照片:

colorspace: RGB, colorprofile: sRGB iec...

我发现了一些文章(例如this link from imageoptimanalogsenses)我应该通过将图片转换为sRGB来保存设备导出的图片,而不会嵌入颜色配置文件,但我无法找到我怎么能这样做?每次我尝试(我没有photoshop,所以我使用命令行ImageMagick),结果图片有以下信息,仍然无法在我的iPad(以及我测试的任何其他iPad)上正确显示:

colorspace: RGB

Here is a example of a picture that do not display correctly on the iPhone or iPad, but does on the web

我想将其转换为正确显示,任何想法都会受到欢迎:)

[编辑]我已成功使用以下参数使用photoshop的“save for web”选项获取正确的图像: ok photoshop export parameters 但是我仍然无法将这些设置自动应用到我的所有照片中。

3 个答案:

答案 0 :(得分:1)

要阅读图像,只需使用:

UIImage *image = [UIImage imageWithContentsOfFile:path];

对于颜色配置文件问题,请尝试sips命令行工具来修复图像文件。类似的东西:

mkdir converted
sips -m "/System/Library/ColorSync/Profiles/sRGB Profile.icc" *.JPG --out converted

答案 1 :(得分:0)

您可以通过CGImage获得色彩空间。

def count_inversion(sequence):
    count = 0    
    def merge_count_inversion(L):
        nonlocal count
        if len(L) > 1:
        ......

    merge_count_inversion(list(sequence))

    return count

并且colorSpace的depping应用格式转换。因此,要获得图像的色彩空间,请执行以下操作:

@property(nonatomic, readonly) CGImageRef CGImage

CGColorSpaceRef CGImageGetColorSpace (
   CGImageRef image
);

注意:请务必遵循CG对象的get / create / copy规则。

颜色转换为RGB8(也可应用于RGB16或RGB32,更改方法CGColorSpaceRef colorspace = CGImageGetColorSpace([myUIImage CGImage]); 中每个组件的位数):

newBitmapRGBA8ContextFromImage

<强> ImageHelper.h

// Create a bitmap
unsigned char *bitmap = [ImageHelper convertUIImageToBitmapRGBA8:image];

    // Create a UIImage using the bitmap
UIImage *imageCopy = [ImageHelper convertBitmapRGBA8ToUIImage:bitmap withWidth:width withHeight:height];

    // Display the image copy on the GUI
UIImageView *imageView = [[UIImageView alloc] initWithImage:imageCopy];

<强> ImageHelper.m

#import <Foundation/Foundation.h>


@interface ImageHelper : NSObject {

}

/** Converts a UIImage to RGBA8 bitmap.
 @param image - a UIImage to be converted
 @return a RGBA8 bitmap, or NULL if any memory allocation issues. Cleanup memory with free() when done.
 */
+ (unsigned char *) convertUIImageToBitmapRGBA8:(UIImage *)image;

/** A helper routine used to convert a RGBA8 to UIImage
 @return a new context that is owned by the caller
 */
+ (CGContextRef) newBitmapRGBA8ContextFromImage:(CGImageRef)image;


/** Converts a RGBA8 bitmap to a UIImage. 
 @param buffer - the RGBA8 unsigned char * bitmap
 @param width - the number of pixels wide
 @param height - the number of pixels tall
 @return a UIImage that is autoreleased or nil if memory allocation issues
 */
+ (UIImage *) convertBitmapRGBA8ToUIImage:(unsigned char *)buffer 
    withWidth:(int)width
    withHeight:(int)height;

@end

答案 2 :(得分:0)

@PhilippeAuriach 我认为您可能会遇到[UIImage imageWithCGImage:cgImage]的问题,我的建议是使用[UIImage imageWithContentsOfFile:path]代替上述内容。

下面的代码可能会对您有所帮助。

if([[NSFileManager defaultManager] fileExistsAtPath:[url path]]){
    //Provide image path here...
    UIImage *image = [UIImage imageWithContentsOfFile:path];

    if(image){
        return image;
    }else{
       //Return default image
       return image;
    }
}