简体   繁体   English

CGBitmapInfo上从Objective-C到Swift的转换问题

[英]Objective-C to Swift Conversion Issue on CGBitmapInfo

I have this Objective-C code that takes out the opaque background of a filter. 我有这个Objective-C代码,它去除了过滤器的不透明背景。 I am trying to convert it to latest Swift and having errors all over the place. 我正在尝试将其转换为最新的Swift,并且到处都有错误。

-(UIImage*)removeColorFromImage:(UIImage*)sourceImage grayLevel:(int)grayLevel
{
    int width = sourceImage.size.width * sourceImage.scale;
    int height = sourceImage.size.height * sourceImage.scale;
    CGFloat scale = sourceImage.scale;

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, width * 4, colorSpace, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedFirst);
    CGColorSpaceRelease(colorSpace);

    CGContextDrawImage(context, CGRectMake(0, 0, width, height), sourceImage.CGImage);

    unsigned int *colorData = CGBitmapContextGetData(context);

    for (int i = 0; i < width * height; i++)
    {
        unsigned int color = *colorData;

        short a = color & 0xFF;
        short r = (color >> 8) & 0xFF;
        short g = (color >> 16) & 0xFF;
        short b = (color >> 24) & 0xFF;

        if ((r == grayLevel) && (g == grayLevel) && (b == grayLevel))
        {
            a = r = g = b = 0;
            *colorData = (unsigned int)(r << 8) + ((unsigned int)(g) << 16) + ((unsigned int)(b) << 24) + ((unsigned int)(a));
        }

        colorData++;
    }

    CGImageRef output = CGBitmapContextCreateImage(context);
    UIImage* retImage = [UIImage imageWithCGImage:output scale:scale orientation:UIImageOrientationUp];

    CGImageRelease(output);
    CGContextRelease(context);

    return retImage;
}

When I convert line by line. 当我逐行转换时。 I've gotten far as this, yet having problems converting lines: 到目前为止,我仍然遇到转换行的问题:

var context = CGBitmapContextCreate(nil, width, height, 8, width * 4, colorSpace, CGBitmapInfo(CGImageAlphaInfo.PremultipliedFirst.rawValue))

EDIT** This is how the errors look: 编辑**这是错误的样子: 在此处输入图片说明

I believe the following is a correct port of the original code: 我相信以下是原始代码的正确端口:

func removeColorFromImage(sourceImage: UIImage, grayLevel: UInt32) -> UIImage? {
    let scale = sourceImage.scale
    let width = Int(sourceImage.size.width * scale)
    let height = Int(sourceImage.size.height * scale)
    let colorSpace = CGColorSpaceCreateDeviceRGB()
    let bitmapInfo = CGBitmapInfo(rawValue: CGBitmapInfo.AlphaInfoMask.rawValue & CGImageAlphaInfo.PremultipliedFirst.rawValue)
    let context = CGBitmapContextCreate(nil, width, height, 8, width * 4, colorSpace, bitmapInfo.rawValue)
    CGContextDrawImage(context, CGRectMake(0, 0, CGFloat(width), CGFloat(height)), sourceImage.CGImage)

    let uncastedData = CGBitmapContextGetData(context)
    let colorData = UnsafeMutablePointer<UInt32>(uncastedData)
    for i in 0..<width * height {
        let color = colorData[i]
        var a = color & 0xFF
        var r = (color >> 8) & 0xFF
        var g = (color >> 16) & 0xFF
        var b = (color >> 24) & 0xFF
        if ((r == grayLevel) && (g == grayLevel) && (b == grayLevel)) {
            (a, r, g, b) = (0, 0, 0, 0)
            colorData[i] = (r << 8) + (g << 16) + (b << 24) + a
        }
        colorData.advancedBy(1)
    }

    if let output = CGBitmapContextCreateImage(context) {
        return UIImage(CGImage: output, scale: scale, orientation: UIImageOrientation.Up)
    }

    return nil
}

Here is an example (original -> output): 这是一个示例(原始->输出):

原版的 输出

removeColorFromImage(original, grayLevel: 175)

Explaining the changes 解释变化

Since Swift 2 (I believe), you must use rawValue for the last parameter of CGBitmapContextCreate: 从Swift 2开始(我相信),您必须对CGBitmapContextCreate的最后一个参数使用rawValue:

let context = CGBitmapContextCreate(nil, width, height, 8, width * 4, colorSpace, bitmapInfo.rawValue)

Also, in your port, you weren't using the original values from the Objective-C code: 另外,在您的端口中,您没有使用Objective-C代码中的原始值:

// your new code was just using CGImageAlphaInfo.PremultipliedFirst.rawValue
// to match, it should be:
let bitmapInfo = CGBitmapInfo(rawValue: CGBitmapInfo.AlphaInfoMask.rawValue & CGImageAlphaInfo.PremultipliedFirst.rawValue)

The bit shifting you were doing in the C-style for loop was on invalid types. 您在C样式的for循环中所做的移位是在无效类型上。 It's on UInt32s now. 现在在UInt32s上。 I got rid of the C-style loop warning for you as well :) 我也为您摆脱了C风格的循环警告:)

Finally, you need to use this to initialize the finalized UIImage: 最后,您需要使用它来初始化最终的UIImage:

UIImage(CGImage: output, scale: scale, orientation: UIImageOrientation.Up)

The class function you were trying to use is not valid. 您尝试使用的类函数无效。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM