1

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を作成する前に、次のようにコードを追加してください。その表示は正しくなります。次のコードは、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でうまく再生できるのに、iOSではRGB24からBGR24に変換する前に間違っているのかを知りたいのです。

4

1 に答える 1

1

これは標準的なエンディアンの問題です。どのバイトがRGB用に標準化されていない色を表します。WindowsはMSBでRを使用し、Mac/iOSはLSBでRを使用します。したがって、WindowsとMac/iOSの間でRGBを移動するときに示したバイトオーダー変換を常に実行する必要があります。vImagePermuteChannels_ARGB8888独自のコードを作成する代わりに、Accelerateフレームワークを使用してこのタイプの変換を行う方が効率的である可能性が高いことに注意してください。

于 2012-07-18T10:52:05.603 に答える