2012-07-18 1 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