如何在IOS中获取独立的Alpha通道?

3

我有一张图片,需要产生仅包含阿尔法坐标的图片......我尝试了下面这个代码,但只能生成红色的图片。请问我的代码哪里有问题?

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

-(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];
}

OutCome

1个回答

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 通道呢? - Srikanth
我的任务是将白皮肤调整为黑皮肤,但在将其调整为标准值时,会产生错误的颜色,所以我需要将其变成完全透明的图像... [在尝试期间,我意识到仅使用alpha通道会产生红色的图像,从而产生错误的颜色]... - Arun
我猜你正在使用jpg图像,整个alpha通道将是白色的。因此,使用我提供的代码会得到白色图像。 - Srikanth
谢谢回复,如果您有时间,请也看一下这篇帖子......http://stackoverflow.com/questions/11478833/how-chage-the-white-skin-face-to-dark-skin-face-in-ios?rq=1 - Arun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接