Objective c iOS-UIImage和alpha在iOS13上的mkOverlayrender中已褪色

Objective 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

我从PNG加载了带有RGBA
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本质上是非线性的。对不起,我想我不能再帮你了。