2015-01-08 2 views
3

원시 데이터에서 CGImageSourceRef을 만드는 방법은 무엇입니까? 이미지의 픽셀 정보로만 구성된 파일 하나가 있습니다. 해상도와 깊이 등을 알고 있습니다 (예 : 640x860, RGB, 8 비트, 방향 = 1, DPI = 300). 이 정보는 파일 내에 저장되지 않습니다. 이미 작성한 것처럼이 파일은 원시 픽셀 정보 만 저장합니다.이미지 원시 데이터에서 CGImageSourceRef를 만드는 방법은 무엇입니까?

NSString *path = @"/Users/.../Desktop/image"; 
NSData *data = [NSData dataWithContentsOfFile: path]; 
CFDataRef cfdata = CFDataCreate(NULL, [data bytes], [data length]); 
CFDictionaryRef options; 
CGImageSourceRef imageSource = CGImageSourceCreateWithData(cfdata, nil); 

이미지 때문에 정의되지 않은 이미지 크기의 제대로 만들어지지 않습니다 :

지금 나는 다음 시도했다. 이 CFImageSourceRef에 대한 이미지 정보 (해상도 등등)를 정의하는 방법을 모르겠습니다. 나는 CFDictionaryRef options를 초기화하고 나는 그것이 방법 CGImageSourceCreateWithData에 사용할 수있는 CFDictionaryRef을 만들 수있는 방법

CGImageSourceRef imageSource = CGImageSourceCreateWithData(cfdata, options); 

에 제공 할 수 있다고 생각?

답변

2

CGImageSource을 사용하고 싶지 않습니다. 원시 픽셀 데이터에는 적합하지 않습니다. 표준 이미지 파일 형식 (PNG, GIF, JPEG 등) 용입니다. 직접 CGImageCreate()를 사용하여 CGImage 만들어야합니다

NSString *path = @"/Users/.../Desktop/image"; 
NSData *data = [NSData dataWithContentsOfFile: path]; 
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data); 
CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 
CGImageRef image = CGImageCreate(640, // width 
           860, // height 
           8, // bitsPerComponent 
           32, // bitsPerPixel 
           4 * 640, // bytesPerRow 
           colorspace, 
           kCGImageAlphaNoneSkipFirst, // bitmapInfo 
           provider, 
           NULL, // decode 
           true, // shouldInterpolate 
           kCGRenderingIntentDefault // intent 
           ); 
CGColorSpaceRelease(colorspace); 
CGDataProviderRelease(provider); 

위 (bitsPerComponent, bitsPerPixel, bytesPerRow, bitmapInfo)의 일부

하는 추측을하여 픽셀 데이터의 사용자에 대한 간단한 설명을 기반으로. 데이터가 맞지 않으면 조정하십시오.

CGDataProviderCreateWithURL() 또는 CGDataProviderCreateWithFilename()을 사용하여 파일에서 직접 데이터 제공 업체를 만들 수는 있지만 어디서나 올 수있는 원시 데이터를 사용하여 파일을 만드는보다 일반적인 방법을 설명하기로했습니다.

+0

감사합니다. – 3ef9g

0

이 코드가 도움이 될지 모르지만이 방법으로 네트워킹에서 다운로드 한 이미지를 만듭니다. 원래 AFNetworking 클래스 중 하나에서이 코드를 발견했습니다.

- (UIImage *)imageFromResponse:(NSHTTPURLResponse *)response data:(NSData *)data scale:(CGFloat)scale { 

    if (!data || [data length] == 0) { 
     return nil; 
    } 

    CGImageRef imageRef = NULL; 
    CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data); 

    if ([response.MIMEType isEqualToString:@"image/png"]) { 
     imageRef = CGImageCreateWithPNGDataProvider(dataProvider, NULL, true, kCGRenderingIntentDefault); 
    } else if ([response.MIMEType isEqualToString:@"image/jpeg"]) { 
     imageRef = CGImageCreateWithJPEGDataProvider(dataProvider, NULL, true, kCGRenderingIntentDefault); 

     // CGImageCreateWithJPEGDataProvider does not properly handle CMKY, so if so, fall back to AFImageWithDataAtScale 
     if (imageRef) { 
      CGColorSpaceRef imageColorSpace = CGImageGetColorSpace(imageRef); 
      CGColorSpaceModel imageColorSpaceModel = CGColorSpaceGetModel(imageColorSpace); 
      if (imageColorSpaceModel == kCGColorSpaceModelCMYK) { 
       CGImageRelease(imageRef); 
       imageRef = NULL; 
      } 
     } 
    } 

    CGDataProviderRelease(dataProvider); 

    UIImage *anImage = [[UIImage alloc] initWithData:data]; 
    UIImage *image = [[UIImage alloc] initWithCGImage:[anImage CGImage] scale:scale orientation:anImage.imageOrientation]; 

    if (!imageRef) { 
     if (image.images || !image) { 
      return image; 
     } 

     imageRef = CGImageCreateCopy([image CGImage]); 
     if (!imageRef) { 
      return nil; 
     } 
    } 

    size_t width = CGImageGetWidth(imageRef); 
    size_t height = CGImageGetHeight(imageRef); 
    size_t bitsPerComponent = CGImageGetBitsPerComponent(imageRef); 

    if (width * height > 1024 * 1024 || bitsPerComponent > 8) { 
     CGImageRelease(imageRef); 

     return image; 
    } 

    size_t bytesPerRow = 0; // CGImageGetBytesPerRow() calculates incorrectly in iOS 5.0, so defer to CGBitmapContextCreate 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGColorSpaceModel colorSpaceModel = CGColorSpaceGetModel(colorSpace); 
    CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef); 

    if (colorSpaceModel == kCGColorSpaceModelRGB) { 
     uint32_t alpha = (bitmapInfo & kCGBitmapAlphaInfoMask); 
     if (alpha == kCGImageAlphaNone) { 
      bitmapInfo &= ~kCGBitmapAlphaInfoMask; 
      bitmapInfo |= kCGImageAlphaNoneSkipFirst; 
     } else if (!(alpha == kCGImageAlphaNoneSkipFirst || alpha == kCGImageAlphaNoneSkipLast)) { 
      bitmapInfo &= ~kCGBitmapAlphaInfoMask; 
      bitmapInfo |= kCGImageAlphaPremultipliedFirst; 
     } 
    } 

    CGContextRef context = CGBitmapContextCreate(NULL, width, height, bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo); 

    CGColorSpaceRelease(colorSpace); 

    if (!context) { 
     CGImageRelease(imageRef); 
     return image; 
    } 

    CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, width, height), imageRef); 
    CGImageRef inflatedImageRef = CGBitmapContextCreateImage(context); 

    CGContextRelease(context); 

    UIImage *inflatedImage = [[UIImage alloc] initWithCGImage:inflatedImageRef scale:scale orientation:image.imageOrientation]; 

    CGImageRelease(inflatedImageRef); 
    CGImageRelease(imageRef); 

    return inflatedImage; 
} 
관련 문제