我是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);
//////////////////////
答案 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];
我没有验证程序的可行性,但希望能够帮到你!