【问题标题】:how to get the alpha channel alone in IOS?如何在 IOS 中单独获取 alpha 通道?
【发布时间】:2012-07-27 11:02:57
【问题描述】:

我有图像,我只需要生成 alpha 坐标的图像... 我做了以下操作,但它只生成了我在代码中做错的红色图像...

提前谢谢.... 我的代码:

-(UIImage*)alphaAlone:(UIImage*)sourceImage
{
     CGImageRef img=sourceImage.CGImage;
    CFDataRef m_DataRef; 
    m_DataRef = CGDataProviderCopyData(CGImageGetDataProvider(img)); 
    UInt8 *dataMasked=(UInt8 *)CFDataGetBytePtr(m_DataRef);
    double length=CFDataGetLength(m_DataRef);

    NSLog(@"length::%f",length);


for(int index=0;index<length;index+=4)
    {

            dataMasked[index]  =dataMasked[index];
            dataMasked[index+1]  =0;
            dataMasked[index+2]  =0;
            dataMasked[index+3]  =0;
     }

 NSUInteger width =CGImageGetWidth(img);
    size_t height=CGImageGetHeight(img);
    size_t bitsPerComponent=CGImageGetBitsPerComponent(img);
    size_t bitsPerPixel=CGImageGetBitsPerPixel(img);
    size_t bytesPerRow=CGImageGetBytesPerRow(img);

    NSLog(@"the w:%u H:%lu",width,height);

    CGColorSpaceRef colorspace=CGImageGetColorSpace(img);
    CGBitmapInfo bitmapInfo=CGImageGetBitmapInfo(img);

    CFDataRef newData=CFDataCreate(NULL,dataMasked,length);
    CGDataProviderRef provider=CGDataProviderCreateWithCFData(newData);
    CGImageRef newImg=CGImageCreate(width,height,bitsPerComponent,bitsPerPixel,bytesPerRow,colorspace,bitmapInfo,provider,NULL,true,kCGRenderingIntentDefault);

    return [UIImage imageWithCGImage:newImg];
}

【问题讨论】:

    标签: objective-c ios5 uiimage pixel uicolor


    【解决方案1】:

    检查这是否有效。此函数返回您自动发布的 alpha 图像。

    - (UIImage*)seperatAlphaFromImage:(UIImage*)pngImage writeToFile:(NSString*)path compressionQuality:(float)value0To1
    {    
    CGRect imageRect = CGRectMake(0, 0, pngImage.size.width, pngImage.size.height);
    
    //Pixel Buffer
    uint32_t* piPixels = (uint32_t*)malloc(imageRect.size.width * imageRect.size.height * sizeof(uint32_t));
    if (piPixels == NULL)
    {
        return nil;
    }
    memset(piPixels, 0, imageRect.size.width * imageRect.size.height * sizeof(uint32_t));
    
    //Drawing image in the buffer
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(piPixels, imageRect.size.width, imageRect.size.height, 8, sizeof(uint32_t) * imageRect.size.width, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast);
    
    CGContextDrawImage(context, imageRect, pngImage.CGImage);
    
    //Copying the alpha values to the red values of the image and setting the alpha to 1
    for (uint32_t y = 0; y < imageRect.size.height; y++) 
    {
        for (uint32_t x = 0; x < imageRect.size.width; x++)
        {
            uint8_t* rgbaValues = (uint8_t*)&piPixels[y * (uint32_t)imageRect.size.width + x];
    
            //alpha = 0, red = 1, green = 2, blue = 3.
    
            rgbaValues[0] = rgbaValues[0];
            rgbaValues[1] = rgbaValues[0];
            rgbaValues[2] = rgbaValues[0];
            rgbaValues[3] = rgbaValues[0];
        }
    }
    
    //Creating image whose red values will preserve the alpha values
    CGImageRef newCGImage = CGBitmapContextCreateImage(context);
    UIImage* newImage = [[[UIImage alloc] initWithCGImage:newCGImage]autorelease];
    CGImageRelease(newCGImage);
    
    return newImage;    
    }
    

    【讨论】:

    • rgbaValues[0] 给出图像的 alpha 值。为什么你需要 Alpha 通道?
    • 我的任务是将白色肤色更改为深色肤色,同时将其更改为标准值它会给出假颜色,因此我需要将其更改为完全透明的图像... [仅在此期间尝试我意识到仅 alpha 会产生红色图像,因此会产生假色]....
    • 我猜你正在使用 jpg 图像,整个 alpha 通道将是白色的。所以你使用我提供的代码得到白色图像。
    • 感谢您的回复,如果您有时间也请看一下这个帖子.....stackoverflow.com/questions/11478833/…
    猜你喜欢
    • 2010-09-24
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 2012-11-17
    • 2020-11-24
    • 2023-04-03
    • 2011-08-22
    • 1970-01-01
    相关资源
    最近更新 更多