[英]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))
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.