【问题标题】:RBG24 can be played well on Windows, but on iOS it can'tRBG24在windows上可以玩得很好,但是在iOS上就不行了
【发布时间】:2012-07-18 10:13:52
【问题描述】:

通过解码器将 H264 视频转换为 rgb24 文件,它可以在 Windows 上很好地显示,但是当我使用 UIImage 在 UIImageView 上显示它时,它的颜色不正确。 我使用的代码是这样的:

- (UIImage *)imageFromAVPicture:(const UInt8 *)pict width:(int)width height:(int)height
{
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
    CFDataRef data = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, pict, width*height*3,kCFAllocatorNull);

    CGDataProviderRef provider = CGDataProviderCreateWithCFData(data);

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    CGImageRef cgImage = CGImageCreate(width, 
                                       height, 
                                       8,
                                       24, 
                                       width*3, 
                                       colorSpace, 
                                       bitmapInfo, 
                                       provider, 
                                       NULL, 
                                       YES, 
                                       kCGRenderingIntentDefault);

    CGColorSpaceRelease(colorSpace);

    UIImage *image = [self scaleImage:cgImage];
    //UIImage *image = [[UIImage alloc] initWithCGImage:cgImage];
    CGImageRelease(cgImage);
    CGDataProviderRelease(provider);
    CFRelease(data);

    return image;
}

但是在创建CGImage之前,添加如下代码,它的显示是正确的,下面的代码所做的是在t rgb和bgr之间进行转换。

UInt8 tmpBuff1,*tmpBuff2;
tmpBuff2 = (UInt8 *)pict;

for(int i =0;i<height;i++)
{
    for(int j=0;j<width;j++)
    {
        tmpBuff1 = *tmpBuff2;
        *tmpBuff2 = *(tmpBuff2+2);
        *(tmpBuff2+2) = tmpBuff1;
        tmpBuff2 += 3;
    }
}

rgb转bgr后,显示正确。

所以我想知道为什么,为什么相同的RGB24文件在PC上可以很好地播放,但在从RGB24转换为BGR24之前在iOS上就出错了。

【问题讨论】:

    标签: ios windows uiimage rgb bgr


    【解决方案1】:

    这是一个标准的字节顺序问题。哪个字节表示哪种颜色未针对 RGB 进行标准化。 Windows 在 MSB 中使用 R,而 Mac/iOS 在 LSB 中使用 R。因此,在 Windows 和 Mac/iOS 之间移动 RGB 时,您总是需要进行字节顺序转换。请注意,您可能会发现使用 Accelerate 框架的 vImagePermuteChannels_ARGB8888 执行这种类型的转换比编写自己的代码更有效。

    【讨论】:

      猜你喜欢
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 2013-06-21
      • 2011-09-11
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      相关资源
      最近更新 更多