2012-07-18 66 views
1

通過解碼器將H264視頻轉換爲rgb24文件,它可以很好地在Windows上顯示,但是當我使用UIImage在UIImageView上顯示時,它的顏色不正確。 我因爲這樣使用代碼:RBG24可以在Windows上播放,但在iOS上它不能

- (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,添加代碼如下,其表演將是正確的,什麼下面的代碼做的是轉變betweent 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上出現錯誤。

回答

1

這是一個標準的排序問題。哪個字節表示哪種顏色不是RGB的標準化。 Windows在MSB中使用R,Mac/iOS在LSB中使用R.所以當你在Windows和Mac/iOS之間移動RGB時,你總是需要做字節順序轉換。請注意,您可能會發現使用Accelerate框架的vImagePermuteChannels_ARGB8888執行此類轉換而不是編寫自己的代碼會更有效。

+0

哦,非常感謝! – zhzhy 2012-07-19 02:06:46

相關問題