Objective c iOS-UIImage和alpha在iOS13上的mkOverlayrender中已褪色
我从PNG加载了带有RGBAObjective c iOS-UIImage和alpha在iOS13上的mkOverlayrender中已褪色,objective-c,uiimage,mkmapview,alpha,Objective C,Uiimage,Mkmapview,Alpha,我从PNG加载了带有RGBAUIImage的mkoverlayrender。对于透明部分,图像的alpha值为0,对于半透明部分,图像的alpha值为160 但是,当我在地图上渲染图像时,颜色有点褪色,整个图像看起来像雾后面。此问题发生在更新到iOS 13之后,旧版本正在按预期工作 我通过[UIImage ImageName:@“some_img”]加载图像 我扩展了mkoverlayrender,并重写了drawMapRect方法: - (void)drawMapRect:(MKMapRect
UIImage
的mkoverlayrender
。对于透明部分,图像的alpha值为0,对于半透明部分,图像的alpha值为160
但是,当我在地图上渲染图像时,颜色有点褪色,整个图像看起来像雾后面。此问题发生在更新到iOS 13之后,旧版本正在按预期工作
我通过[UIImage ImageName:@“some_img”]加载图像代码>
我扩展了mkoverlayrender
,并重写了drawMapRect
方法:
- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context {
UIImage * img = [UIImage imageNamed:@"some_img"];
MKMapRect theMapRect = self.overlay.boundingMapRect;
CGRect theRect = [self rectForMapRect:theMapRect];
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0.0, -theRect.size.height);
CGContextDrawImage(context, theRect, img.CGImage);
}
我尝试通过创建图像副本并使用以下公式手动处理RGBA像素,从图像中手动删除预乘alpha(将alpha设置为255,而不是160):
CGImageRef sourceImage = img.CGImage;
CFDataRef theData;
theData = CGDataProviderCopyData(CGImageGetDataProvider(sourceImage));
UInt8 *pixelData = (UInt8 *) CFDataGetBytePtr(theData);
int dataLength = CFDataGetLength(theData);
for (int i = 0; i < dataLength; i += 4){
uint8_t aHalf = pixelData[i + 3] / 2;
pixelData[i + 0] = (pixelData[i + 0] * 255 + aHalf) / pixelData[i + 3];
pixelData[i + 1] = (pixelData[i + 1] * 255 + aHalf) / pixelData[i + 3];
pixelData[i + 2] = (pixelData[i + 2] * 255 + aHalf) / pixelData[i + 3];
pixelData[i + 3] = (pixelData[i + 3] == 0) ? 0 : 255;
}
CGContextRef context;
context = CGBitmapContextCreate(pixelData,
CGImageGetWidth(sourceImage),
CGImageGetHeight(sourceImage),
8,
CGImageGetBytesPerRow(sourceImage),
CGImageGetColorSpace(sourceImage),
kCGImageAlphaPremultipliedLast);
UIImage *newImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)];
CGImageRef sourceImage=img.CGImage;
CFDataRef数据;
数据=CGDataProviderCopyData(CGImageGetDataProvider(sourceImage));
UInt8*像素数据=(UInt8*)CFDataGetBytePtr(数据);
int dataLength=CFDataGetLength(theData);
对于(int i=0;i
然后设置CGContextSetAlpha(context,0.6)代码>在drawMapRect
中
这部分解决了这个问题,但在较旧的iOS版本上,图像的透明度不如iOS 13,而且整个过程需要时间 遇到了同样的问题:
苹果公司的回应是,这是由于渲染器中CGContext的颜色空间发生了变化。在iOS 12中使用了RGB颜色空间,但iOS 13现在使用的是线性sRGB颜色空间
我能够将源图像转换为使用线性sRGB和ImageMagick,现在它们在渲染为透明时显示正确的阴影。我不确定您是否拥有源图像,是否可以转换它们,但如果可以,应该可以解决您的问题 遇到了同样的问题:
苹果公司的回应是,这是由于渲染器中CGContext的颜色空间发生了变化。在iOS 12中使用了RGB颜色空间,但iOS 13现在使用的是线性sRGB颜色空间
我能够将源图像转换为使用线性sRGB和ImageMagick,现在它们在渲染为透明时显示正确的阴影。我不确定您是否拥有源图像,是否可以转换它们,但如果可以,应该可以解决您的问题 sRGB是非线性的。所以我不确定什么是线性sRGB。你有没有参考过苹果公司的说法?@fmw42以下是苹果开发人员技术支持的引用:“传递给覆盖渲染器的CGContext上的颜色空间已更改-它在iOS 12上是设备的RGB颜色空间,但在iOS 13上,它现在使用线性sRGB颜色空间。最简单的方法是创建一个使用线性sRGB颜色空间的更新地图图像,并将该图像加载到iOS 13上,但保留iOS 12的现有图像。“我承认,我对这方面的知识非常有限,而且苹果工程师可能添加了一个”s““偶然。我不明白什么是线性sRGB?sRGB本质上是非线性的。对不起,我想我不能再帮你了。sRGB是非线性的。所以我不确定什么是线性sRGB。你有没有参考过苹果公司的说法?@fmw42以下是苹果开发人员技术支持的引用:“传递给覆盖渲染器的CGContext上的颜色空间已更改-它在iOS 12上是设备的RGB颜色空间,但在iOS 13上,它现在使用线性sRGB颜色空间。最简单的方法是创建一个使用线性sRGB颜色空间的更新地图图像,并将该图像加载到iOS 13上,但保留iOS 12的现有图像。“我承认,我对这方面的知识非常有限,而且苹果工程师可能添加了一个”s““偶然。我不明白什么是线性sRGB?sRGB本质上是非线性的。对不起,我想我不能再帮你了。