Skip to content

Instantly share code, notes, and snippets.

@rickytan
Created September 26, 2017 15:09
Show Gist options
  • Save rickytan/88b706f89c4333d4964a15aad0cf5d0e to your computer and use it in GitHub Desktop.
Save rickytan/88b706f89c4333d4964a15aad0cf5d0e to your computer and use it in GitHub Desktop.
convert to sRGB space
- (UIImage *)mz_convertToSRGBColorSpace
{
UIImage *newImage = self;
do {
CGImageRef CGImage = self.CGImage;
CGColorSpaceRef srcSpace = CGImageGetColorSpace(CGImage);
CGColorSpaceRef dstSpace = IS_IOS_9 ? CGColorSpaceCreateWithName(kCGColorSpaceSRGB) : CGColorSpaceCreateDeviceRGB();
// 颜色空间一样直接返回 self
if (CFEqual(srcSpace, CFAutorelease(CGColorSpaceCreateDeviceRGB())) ||
CFEqual(srcSpace, dstSpace)) {
CGColorSpaceRelease(dstSpace);
break;
}
vImage_Buffer srcBuffer;
vImage_Buffer dstBuffer;
vImage_CGImageFormat srcFormat = {
.bitsPerComponent = (uint32_t)CGImageGetBitsPerComponent(CGImage),
.bitsPerPixel = (uint32_t)CGImageGetBitsPerPixel(CGImage),
.colorSpace = srcSpace,
.bitmapInfo = CGImageGetBitmapInfo(CGImage)
};
vImage_CGImageFormat dstFormat = {
.bitsPerComponent = (uint32_t)CGImageGetBitsPerComponent(CGImage),
.bitsPerPixel = (uint32_t)CGImageGetBitsPerPixel(CGImage),
.colorSpace = dstSpace,
.bitmapInfo = CGImageGetBitmapInfo(CGImage)
};
vImage_Error error = kvImageNoError;
error = vImageBuffer_InitWithCGImage(&srcBuffer, &srcFormat, NULL, CGImage, kvImageNoFlags);
if (error != kvImageNoError) {
CGColorSpaceRelease(dstSpace);
break;
}
vImageConverterRef convertRef = vImageConverter_CreateWithCGImageFormat(&srcFormat, &dstFormat, NULL, kvImageNoFlags, &error);
if (error != kvImageNoError) {
free(srcBuffer.data);
CGColorSpaceRelease(dstSpace);
break;
}
error = vImageBuffer_Init(&dstBuffer, srcBuffer.height, srcBuffer.width, dstFormat.bitsPerPixel, kvImageNoFlags);
if (error != kvImageNoError) {
free(srcBuffer.data);
CGColorSpaceRelease(dstSpace);
vImageConverter_Release(convertRef);
break;
}
error = vImageConvert_AnyToAny(convertRef, &srcBuffer, &dstBuffer, NULL, kvImageNoFlags);
if (error != kvImageNoError) {
free(srcBuffer.data);
free(dstBuffer.data);
CGColorSpaceRelease(dstSpace);
vImageConverter_Release(convertRef);
break;
}
CGImageRef newCGImage = vImageCreateCGImageFromBuffer(&dstBuffer, &dstFormat, NULL, NULL, kvImageNoFlags, &error);
if (error != kvImageNoError) {
if (newCGImage) {
CGImageRelease(newCGImage);
}
free(srcBuffer.data);
free(dstBuffer.data);
CGColorSpaceRelease(dstSpace);
vImageConverter_Release(convertRef);
break;
}
newImage = [UIImage imageWithCGImage:newCGImage];
free(srcBuffer.data);
free(dstBuffer.data);
CGImageRelease(newCGImage);
CGColorSpaceRelease(dstSpace);
vImageConverter_Release(convertRef);
} while(0);
return newImage;
}
@dhc-guopingfang
Copy link

HEIC 格式的图片,会旋转90度

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment