Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么iPhone 7和iPhone 7 Plus屏幕截图发送的alpha与RGB颜色空间图像不兼容?_Ios_Objective C_Iphone_Ios10 - Fatal编程技术网

Ios 为什么iPhone 7和iPhone 7 Plus屏幕截图发送的alpha与RGB颜色空间图像不兼容?

Ios 为什么iPhone 7和iPhone 7 Plus屏幕截图发送的alpha与RGB颜色空间图像不兼容?,ios,objective-c,iphone,ios10,Ios,Objective C,Iphone,Ios10,我正在尝试创建位图上下文,以便调整从摄影机卷导入的图像的大小。代码如下: CGContextRef bitmap = CGBitmapContextCreate(NULL, newRect.size.width, newRect.size.height,

我正在尝试创建位图上下文,以便调整从摄影机卷导入的图像的大小。代码如下:

    CGContextRef bitmap = CGBitmapContextCreate(NULL,
                                            newRect.size.width,
                                            newRect.size.height,
                                            CGImageGetBitsPerComponent(imageRef),
                                            0,
                                            CGImageGetColorSpace(imageRef),
                                            CGImageGetBitmapInfo(imageRef));
我在iPhone7上拍摄了两张截图,当我试图从相机上加载它们时,一张失败,另一张成功

第一个是失败的:

<CGImage 0x1701de3c0>
<<CGColorSpace 0x174a325c0> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; Display P3)>
    width = 750, height = 1334, bpc = 16, bpp = 64, row bytes = 6000 
    kCGImageAlphaLast | kCGImageByteOrder16Little 
    is mask? No, has mask? No, has matte? No, should interpolate? Yes
<CGImage 0x1705c0a50>
<<CGColorSpace 0x17402b7c0> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1)>
    width = 750, height = 1334, bpc = 8, bpp = 32, row bytes = 3000 
    kCGImageAlphaPremultipliedLast | 0 (default byte order) 
    is mask? No, has mask? No, has matte? No, should interpolate? Yes

宽度=750,高度=1334,bpc=16,bpp=64,行字节=6000
kCGImageAlphaLast | KCGIMAGEByteOrder16小
这是面具吗?没有,有面具吗?没有,有马特吗?不,应该插入吗?对
以下是错误:

<Error>: CGBitmapContextCreate: unsupported parameter combination:
     16 integer bits/component;
     64 bits/pixel;
    RGB color space model; kCGImageAlphaLast;
    3840 bytes/row.
Valid parameters for RGB color space model are:
    16  bits per pixel,         5  bits per component,         kCGImageAlphaNoneSkipFirst
    32  bits per pixel,         8  bits per component,         kCGImageAlphaNoneSkipFirst
    32  bits per pixel,         8  bits per component,         kCGImageAlphaNoneSkipLast
    32  bits per pixel,         8  bits per component,         kCGImageAlphaPremultipliedFirst
    32  bits per pixel,         8  bits per component,         kCGImageAlphaPremultipliedLast
    64  bits per pixel,         16 bits per component,         kCGImageAlphaPremultipliedLast
    64  bits per pixel,         16 bits per component,         kCGImageAlphaNoneSkipLast
    64  bits per pixel,         16 bits per component,         kCGImageAlphaPremultipliedLast|kCGBitmapFloatComponents
    64  bits per pixel,         16 bits per component,         kCGImageAlphaNoneSkipLast|kCGBitmapFloatComponents
    128 bits per pixel,         32 bits per component,         kCGImageAlphaPremultipliedLast|kCGBitmapFloatComponents
    128 bits per pixel,         32 bits per component,         kCGImageAlphaNoneSkipLast|kCGBitmapFloatComponents
See Quartz 2D Programming Guide (available online) for more information.
:CGBitmapContextCreate:不支持的参数组合:
16个整数位/分量;
64位/像素;
RGB颜色空间模型;kCGImageAlphaLast;
3840字节/行。
RGB颜色空间模型的有效参数为:
每像素16位,每组件5位,KCGIMAGEALPHANEONSKIPFIRST
每个像素32位,每个组件8位,KCGIMAGEALPHANEONSKIPFIRST
每个像素32位,每个组件8位,kCGImageAlphaNoneSkipLast
每个像素32位,每个组件8位,KCGIMAGEAlpha预乘优先
每个像素32位,每个组件8位,KCGIMAGEAlpha预乘Last
每个像素64位,每个组件16位,KCGIMAGEAlphaPremultipledLast
每个像素64位,每个组件16位,kCGImageAlphaNoneSkipLast
每个像素64位,每个组件16位,KCGIMAGEAlphaPremultipledLast | kCGBitmapFloatComponents
每个像素64位,每个组件16位,kCGImageAlphaNoneSkipLast | kCGBitmapFloatComponents
每个像素128位,每个组件32位,KCGIMAGEAlphaPremultipledLast | kCGBitmapFloatComponents
每个像素128位,每个组件32位,kCGImageAlphaNoneSkipLast | kCGBitmapFloatComponents
有关更多信息,请参阅《石英二维编程指南》(在线提供)。
第二个是成功的:

<CGImage 0x1701de3c0>
<<CGColorSpace 0x174a325c0> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; Display P3)>
    width = 750, height = 1334, bpc = 16, bpp = 64, row bytes = 6000 
    kCGImageAlphaLast | kCGImageByteOrder16Little 
    is mask? No, has mask? No, has matte? No, should interpolate? Yes
<CGImage 0x1705c0a50>
<<CGColorSpace 0x17402b7c0> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1)>
    width = 750, height = 1334, bpc = 8, bpp = 32, row bytes = 3000 
    kCGImageAlphaPremultipliedLast | 0 (default byte order) 
    is mask? No, has mask? No, has matte? No, should interpolate? Yes

宽度=750,高度=1334,bpc=8,bpp=32,行字节=3000
KCGIMAGEAlphaPremultipledLast | 0(默认字节顺序)
这是面具吗?没有,有面具吗?没有,有马特吗?不,应该插入吗?对
我找不到关于这一特殊情况的任何明确信息。所以,我想知道是否有人对这个问题有任何见解,并对可能的解决方案提出建议。我在这里完全感到困惑。

我的崩溃日志表明,此问题仅在我的iPhone 7和iPhone 7 Plus用户中发现


提前感谢。

我希望有人能找到更好的解决方案,因为这是一种黑客行为,但我的解决方法是:

kgimagealphalast
参数是该位图信息中不受支持的部分。对于图像完全不透明的情况,您可以使用
kgimagealphapremultipliedLast
,并获得相同的结果,因为在完全不透明的情况下,alpha预乘基本上是无运算(每个像素都乘以一)

但是警告,如果图像有任何半透明像素,它们的颜色将是错误的。在我的情况下,我希望完全不透明的照片,否则用户没有正确使用我的应用程序,所以我现在可以接受这个

CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);

// first try
CGContextRef bitmap = CGBitmapContextCreate(NULL,
                                        newRect.size.width,
                                        newRect.size.height,
                                        CGImageGetBitsPerComponent(imageRef),
                                        0,
                                        CGImageGetColorSpace(imageRef),
                                        bitmapInfo);

if (!bitmap && (bitmapInfo & kCGBitmapAlphaInfoMask) == kCGImageAlphaLast) {

    // WARNING - only do this if you expect a fully opaque image

    // try again with pre-multiply alpha

    // clear alpha bits
    bitmapInfo &= ~kCGBitmapAlphaInfoMask;
    // set pre-multiply last
    bitmapInfo |= kCGImageAlphaPremultipliedLast & kCGBitmapAlphaInfoMask;

    CGContextRef bitmap = CGBitmapContextCreate(NULL,
                                        newRect.size.width,
                                        newRect.size.height,
                                        CGImageGetBitsPerComponent(imageRef),
                                        0,
                                        CGImageGetColorSpace(imageRef),
                                        bitmapInfo);

}

if (!bitmap) {
    // fail gracefully
}

CGImageGetBitsPerComponent(imageRef)
,你得到了什么?@DonMag我更新了问题,以包含运行时打印出来的CGImage信息。有什么东西在响。。。但现在我认为这是无关的。然而,我的猜测是
(KCGColorSpaceICCBase;kCGColorSpaceModelRGB;Display P3)
——P3部分指的是iPhone 7新增的苹果“宽颜色”显示屏。。。不确定你需要做什么来处理这个问题,但可能是一个开始寻找的地方。只是一个信息。我公司的一名开发人员正在从该设备上手动拍摄屏幕截图,并试图将其上传到itunesconnect。由于这个错误,它失败了。RGB也有问题:)看起来这在代码中不是问题!!如果它真的是一个屏幕截图,那么alpha通道中就不会有任何数据,所以这真的不重要。这是我现在将使用的解决方案。像你一样,我希望有人能很快找到更好的解决办法。谢谢你的意见。