Ios 将UIImage转换为8位

Ios 将UIImage转换为8位,ios,objective-c,Ios,Objective C,我希望将UIImage转换为8位。我尝试过这样做,但我不确定我是否做对了,因为我稍后尝试使用图像处理库leptonica时收到一条消息,该库声明它不是8位。有没有人能告诉我,我是否做得正确,或者如何做的代码 谢谢 代码 CGImageRef myCGImage = image.CGImage; CFDataRef data = CGDataProviderCopyData(CGImageGetDataProvider(myCGImage)); const UInt8 *imageData

我希望将UIImage转换为8位。我尝试过这样做,但我不确定我是否做对了,因为我稍后尝试使用图像处理库leptonica时收到一条消息,该库声明它不是8位。有没有人能告诉我,我是否做得正确,或者如何做的代码

谢谢

代码

 CGImageRef myCGImage = image.CGImage;
 CFDataRef data = CGDataProviderCopyData(CGImageGetDataProvider(myCGImage));
 const UInt8 *imageData = CFDataGetBytePtr(data);

以下代码适用于没有alpha通道的图像:

    CGImageRef c = [[UIImage imageNamed:@"100_3077"] CGImage];

    size_t bitsPerPixel = CGImageGetBitsPerPixel(c);
    size_t bitsPerComponent = CGImageGetBitsPerComponent(c);
    size_t width = CGImageGetWidth(c);
    size_t height = CGImageGetHeight(c);

    CGImageAlphaInfo a = CGImageGetAlphaInfo(c);

    NSAssert(bitsPerPixel == 32 && bitsPerComponent == 8 && a == kCGImageAlphaNoneSkipLast, @"unsupported image type supplied");

    CGContextRef targetImage = CGBitmapContextCreate(NULL, width, height, 8, 1 * CGImageGetWidth(c), CGColorSpaceCreateDeviceGray(), kCGImageAlphaNone);

    UInt32 *sourceData = (UInt32*)[((__bridge_transfer NSData*) CGDataProviderCopyData(CGImageGetDataProvider(c))) bytes];
    UInt32 *sourceDataPtr;

    UInt8 *targetData = CGBitmapContextGetData(targetImage);

    UInt8 r,g,b;
    uint offset;
    for (uint y = 0; y < height; y++)
    {
        for (uint x = 0; x < width; x++)
        {
            offset = y * width + x;

            if (offset+2 < width * height)
            {
                sourceDataPtr = &sourceData[y * width + x];

                r = sourceDataPtr[0+0];
                g = sourceDataPtr[0+1];
                b = sourceDataPtr[0+2];

                targetData[y * width + x] = (r+g+b) / 3;
            }
        }
    }

    CGImageRef newImageRef = CGBitmapContextCreateImage(targetImage);
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];

    CGContextRelease(targetImage);
    CGImageRelease(newImageRef);
CGImageRef c=[[UIImage ImageName:@“100_3077”]CGImage];
size_t bitsPerPixel=cgmagegetbitsperpixel(c);
大小\u t bitsPerComponent=CGImageGetBitsPerComponent(c);
尺寸\u t宽度=CGImageGetWidth(c);
尺寸高度=CGImageGetHeight(c);
CGImageAlphaInfo a=CGImageGetAlphaInfo(c);
NSAssert(bitsPerPixel==32&&bitsPerComponent==8&&a==kCGImageAlphaNoneSkipLast,@“提供了不支持的图像类型”);
CGContextRef targetImage=CGBitmapContextCreate(NULL,width,height,8,1*CGImageGetWidth(c),CGColorSpaceCreateDeviceGray(),kCGImageAlphaNone);
UInt32*源数据=(UInt32*)[((桥接传输NSData*)CGDataProviderCopyData(CGImageGetDataProvider(c))字节];
UInt32*源数据PTR;
UInt8*targetData=CGBitmapContextGetData(targetImage);
UInt8 r,g,b;
单位偏移量;
对于(uint y=0;y<高度;y++)
{
对于(uint x=0;x
使用此代码,我将rgb图像转换为灰度图像:


希望这有助于

了解如何访问原始像素数据,您必须将其转换为8位。如果事先知道格式,这很简单,例如,对于RGBA,只需找到R、g、B通道的平均值。我想他指的是灰度。Leptonica是一个图像处理库。大多数图像处理库都是处理灰度图像的。我试过了,结果在图像的最底部出现了访问冲突。嗯,我试过了你发布的图像,结果也出现了同样的错误。最后一个像素似乎有些不同。。。我已经更新了代码,所以我们不能超出图像的界限。