Преобразование данных RGB в растровое изображение в Objective-C++ Cocoa

У меня есть буфер RGB без знака, который я хотел бы преобразовать в растровый файл, кто-нибудь знает, как это сделать?

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

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

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


person ReachConnection    schedule 16.10.2009    source источник
comment
можете ли вы помочь мне здесь пожалуйста   -  person Matrosov Alexander    schedule 04.02.2015


Ответы (2)


Вы можете использовать CGBitmapContextCreate для создания растрового контекста из необработанных данных. Затем вы можете создать CGImageRef из контекста растрового изображения и сохранить его. К сожалению, CGBitmapContextCreate немного требователен к формату данных. Он не поддерживает 24-битные данные RGB. Цикл в начале преобразует данные rgb в rgba с нулевым альфа-значением в конце. Вы должны включить и связать с инфраструктурой 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);
person nschmidt    schedule 17.10.2009
comment
ншмидт ты лучший!!! у вас так много знаний в области графических вычислений/обработки. - person ReachConnection; 19.10.2009
comment
Большое спасибо. Я искал такой код несколько дней! - person Andrew; 27.01.2012
comment
не могли бы вы помочь мне здесь пожалуйста - person Matrosov Alexander; 04.02.2015
comment
@nschmidt Я пытался адаптировать ваш ответ для iOS, чтобы я мог преобразовать необработанные значения яркости обратно в UIImage, и я думаю, что я близок, но я не могу понять это. Вот мой вопрос на случай, если у вас есть время запасной. Спасибо! - person KingPolygon; 27.03.2016

Заимствование из кода 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], чтобы содержать дом в чистоте.

person inked    schedule 05.11.2009