将数组转换为单通道图像

时间:2013-11-22 16:26:25

标签: objective-c arrays image channel

我是Xcode初学者,我正在开展一个项目,我必须将float[x][y]数组转换为单通道(灰度)图像。然后创建一个方法,将此图像转换回float[x][y]; 我们非常感谢您对该主题的任何帮助,如果可能的话,请尽可能详细地说明您的答案。 提前谢谢

更新1: x和y是行和线的坐标。 float是0到1之间的像素值(当然,对于8位,像素值是0到255之间的int); 黑白图像的值介于0或1之间,而灰度值介于0和1之间,但两个图像应为单通道图像,因为我们不需要RGB和alfa,只需一个通道即可足够

更新2: 我不知道如何从浮动表重新创建图像,但我能找到的是如何将一个4 8位通道图像转换为浮动表,但我希望找到一种更有效的方式,并且更快,我是不确定这个将适用于一个频道图像:

/////////////////////
CGImageRef imageRef = [FilteredImage CGImage];

    int lenght = width*height;

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    unsigned char *rawData = (unsigned char*) calloc(height * width * 4, sizeof(unsigned char));
    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), imageRef);
    CGContextRelease(context);

    // Now your rawData contains the image data in the RGBA8888 pixel format.

    int byteIndex = 0;

    for (int i = 0 ; i < lenght ; ++i)

    {
        int X=0,Y=0;
        CGFloat red   = (rawData[byteIndex]     * 1.0) / 255.0;
        CGFloat green = (rawData[byteIndex + 1] * 1.0) / 255.0;
        CGFloat blue  = (rawData[byteIndex + 2] * 1.0) / 255.0;
//      CGFloat alpha = (rawData[byteIndex + 3] * 1.0) / 255.0;
        float grayscale = ( red + green + blue )/3;
        GrayscaleArray[Y][X] = grayscale;
        X++;
        if( X == width )
            Y++;
        byteIndex += 4;

    }
    free(rawData);

//////////////////////

1 个答案:

答案 0 :(得分:3)

/////////////////////////
unsigned int *pixels = (unsigned int *)malloc(width * height * 4);
memcpy(pixels, buffer, width * height * 4);

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, pixels, width * height * 4, NULL);
CGImageRef cgImage = CGImageCreate(width, height, 8, 32, width * 4, colorSpace,   kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big, provider, NULL, false, kCGRenderingIntentDefault);

UIImage *image = [UIImage imageWithCGImage:cgImage];
//////////////////////////

相反的转换可能

1:将RGB图像更改为灰色图像。

2:保存图像中的数据。

-(UIImage*)getGrayImage:(UIImage*)sourceImage   
{   
int width = sourceImage.size.width;   
int height = sourceImage.size.height;   
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();   
CGContextRef context = CGBitmapContextCreate (nil,width,height,8,0,colorSpace,kCGImageAlphaNone);   
CGColorSpaceRelease(colorSpace);   
if (context == NULL) {   
    return nil;   
}   
CGContextDrawImage(context,CGRectMake(0, 0, width, height), sourceImage.CGImage);   
UIImage *grayImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)];   
CGContextRelease(context);   
return grayImage;   
}  


NSData *imageData = UIImagePNGRepresentation(grayImage); 
Byte *testByte = (Byte *)[testData bytes];

我没有验证程序的可行性,但希望能够帮到你!