Преобразование информации растрового изображения в CGImage в iPhone OS 3 - PullRequest
1 голос
/ 13 мая 2010

Я хочу создать CGImage с информацией о цвете, которая у меня уже есть

Вот код для преобразования CGImage в CML, CML_color - матричная структура

- (void)CGImageReftoCML:(CGImageRef)image destination:(CML_color &)dest{
CML_RGBA p;
NSUInteger width=CGImageGetWidth(image);
NSUInteger height=CGImageGetHeight(image);
CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB();

unsigned char *rawData=(unsigned char*)malloc(height*width*4);
NSUInteger bytesPerPixel=4;
NSUInteger bytesPerRow=bytesPerPixel*width;
NSUInteger bitsPerComponent=8;

CGContextRef context=CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);

CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);
CGContextRelease(context);

int index=0;
for (int i=0; i<height; i++) {
    for (int j=0; j<width; j++) {
        p.red=rawData[index++];
        p.green=rawData[index++];
        p.blue=rawData[index++];
        p.alpha=rawData[index++];
        dest(i,j)=p;
    }
}

delete[] rawData;

}

Теперь мне нужна функция реверса, которая конвертирует CML в CGImage.Я знаю всю цветовую и альфа-информацию для создания изображения, которая хранится в матрице CML, но как я могу это сделать?

1 Ответ

3 голосов
/ 14 мая 2010

После того, как погуглил вокруг, я наконец понял, как это сделать сам

Вот код:

- (CGImageRef)CMLtoCGImage:(CML_color &)source{
    int imageWidth=source.Width();
    int imageHeight=source.Height();
    char* rgba=(char*)malloc(imageWidth*imageHeight*4);

    for (int i=0; i<imageHeight; i++) {
        for (int j=0; j<imageWidth; j++) {
            rgba[4*(i*imageWidth+j)]=source(i,j).red;
            rgba[4*(i*imageWidth+j)+1]=source(i,j).green;
            rgba[4*(i*imageWidth+j)+2]=source(i,j).blue;
            rgba[4*(i*imageWidth+j)+3]=source(i,j).alpha;
        }
    }

    CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB();
    CGContextRef bitmapContext=CGBitmapContextCreate(rgba, imageWidth, imageHeight, 8, 4*imageWidth, colorSpace, kCGImageAlphaNoneSkipLast);
    CFRelease(colorSpace);

    CGImageRef cgImage=CGBitmapContextCreateImage(bitmapContext);
    free(rgba);

    return cgImage;
}
...