2009-10-16 3 views
18

У меня есть буфер беззнакового символа RGB, который я бы хотел преобразовать в растровый файл, знает ли кто-нибудь?Преобразование данных RGB в растровое изображение в Objective-C++ Cocoa

Мой RGB поплавка имеет следующий формат

R [(0,0)] G [(0,0)], В [(0,0)], R [(0,1) ], G [(0,1)], B [(0,1)], R [(0,2)], G [(0,2)], B [(0,2)] .... .

Значения для каждого блока данных варьируются от 0 до 255. У кого-нибудь есть идеи, как я могу сделать это преобразование?

+0

Вы можете помочь мне [здесь] (http://stackoverflow.com/questions/28310186/cgimage-grab-and-create-pixel), пожалуйста, –

ответ

33

Вы можете использовать CGBitmapContextCreate для создания растрового контекста из ваших необработанных данных. Затем вы можете создать CGImageRef из контекста растрового изображения и сохранить его. К сожалению, CGBitmapContextCreate немного придирчив к формату данных. Он не поддерживает 24-разрядные данные RGB. Цикл в начале swizzles данные rgb в rgba с альфа-значением нуля в конце. Вы должны включить и связать с Framework ApplicationServices.

char* rgba = (char*)malloc(width*height*4); 
for(int i=0; i < width*height; ++i) { 
    rgba[4*i] = myBuffer[3*i]; 
    rgba[4*i+1] = myBuffer[3*i+1]; 
    rgba[4*i+2] = myBuffer[3*i+2]; 
    rgba[4*i+3] = 0; 
} 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef bitmapContext = CGBitmapContextCreate(
    rgba, 
    width, 
    height, 
    8, // bitsPerComponent 
    4*width, // bytesPerRow 
    colorSpace, 
    kCGImageAlphaNoneSkipLast); 

CFRelease(colorSpace); 

CGImageRef cgImage = CGBitmapContextCreateImage(bitmapContext); 
CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR("image.png"), kCFURLPOSIXPathStyle, false); 

CFStringRef type = kUTTypePNG; // or kUTTypeBMP if you like 
CGImageDestinationRef dest = CGImageDestinationCreateWithURL(url, type, 1, 0); 

CGImageDestinationAddImage(dest, cgImage, 0); 

CFRelease(cgImage); 
CFRelease(bitmapContext); 
CGImageDestinationFinalize(dest); 
free(rgba); 
+0

nschmidt, что вы лучший !!! У вас столько знаний в области графических вычислений/обработки. – ReachConnection

+0

Рад, что я мог бы помочь :) – nschmidt

+0

Большое спасибо. Я искал такой код в течение нескольких дней! – Twinkle

2

заимствования из кода nschmidt, чтобы произвести знакомое, если кто-то красные глаза изображения:

int width = 11; 
int height = 8; 

Byte r[8][11]={ 
    {000,000,255,000,000,000,000,000,255,000,000}, 
    {000,000,000,255,000,000,000,255,000,000,000}, 
    {000,000,255,255,255,255,255,255,255,000,000}, 
    {000,255,255,255,255,255,255,255,255,255,000}, 
    {255,255,255,255,255,255,255,255,255,255,255}, 
    {255,000,255,255,255,255,255,255,255,000,255}, 
    {255,000,255,000,000,000,000,000,255,000,255}, 
    {000,000,000,255,255,000,255,255,000,000,000}}; 

Byte g[8][11]={ 
    {000,000,255,000,000,000,000,000,255,000,000}, 
    {000,000,000,255,000,000,000,255,000,000,000}, 
    {000,000,255,255,255,255,255,255,255,000,000}, 
    {000,255,255,000,255,255,255,000,255,255,000}, 
    {255,255,255,255,255,255,255,255,255,255,255}, 
    {255,000,255,255,255,255,255,255,255,000,255}, 
    {255,000,255,000,000,000,000,000,255,000,255}, 
    {000,000,000,255,255,000,255,255,000,000,000}}; 

Byte b[8][11]={ 
    {000,000,255,000,000,000,000,000,255,000,000}, 
    {000,000,000,255,000,000,000,255,000,000,000}, 
    {000,000,255,255,255,255,255,255,255,000,000}, 
    {000,255,255,000,255,255,255,000,255,255,000}, 
    {255,255,255,255,255,255,255,255,255,255,255}, 
    {255,000,255,255,255,255,255,255,255,000,255}, 
    {255,000,255,000,000,000,000,000,255,000,255}, 
    {000,000,000,255,255,000,255,255,000,000,000}}; 

char* rgba = (char*)malloc(width*height*4); 
int offset=0; 
for(int i=0; i < height; ++i) 
{ 
    for (int j=0; j < width; j++) 
    { 
     rgba[4*offset] = r[i][j]; 
     rgba[4*offset+1] = g[i][j]; 
     rgba[4*offset+2] = b[i][j]; 
     rgba[4*offset+3] = 0; 
     offset ++; 
    } 
} 


CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef bitmapContext = CGBitmapContextCreate(
                rgba, 
                width, 
                height, 
                8, // bitsPerComponent 
                4*width, // bytesPerRow 
                colorSpace, 
                kCGImageAlphaNoneSkipLast); 

CFRelease(colorSpace); 

CGImageRef cgImage = CGBitmapContextCreateImage(bitmapContext); 

free(rgba); 

UIImage *newUIImage = [UIImage imageWithCGImage:cgImage]; 

UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 11,8)]; 

[iv setImage:newUIImage]; 

Затем addSubview:iv, чтобы получить изображение на ваш взгляд, и, конечно же, сделать обязательную [releases] для держите чистый дом.

Смежные вопросы