我正在开发一款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如何不使用嵌入式颜色配置文件,所以我发现我是这样的。使用以下信息保存照片:
我发现了一些文章(例如this link from imageoptim或analogsenses)我应该通过将图片转换为sRGB来保存设备导出的图片,而不会嵌入颜色配置文件,但我无法找到我怎么能这样做?每次我尝试(我没有photoshop,所以我使用命令行ImageMagick),结果图片有以下信息,仍然无法在我的iPad(以及我测试的任何其他iPad)上正确显示:
我想将其转换为正确显示,任何想法都会受到欢迎:)
[编辑]我已成功使用以下参数使用photoshop的“save for web”选项获取正确的图像: 但是我仍然无法将这些设置自动应用到我的所有照片中。
答案 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;
}
}