gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:27:09 25 4
gpt4 key购买 nike

我有这段 Objective-C 代码,可以去除过滤器的不透明背景。我正在尝试将其转换为最新的 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;
}

当我逐行转换时。我已经做到了这一点,但在转换行时遇到问题:

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

编辑**错误如下所示: enter image description here

最佳答案

我相信以下是原始代码的正确移植:

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
}

这是一个示例(原始 -> 输出):

original output

removeColorFromImage(original, grayLevel: 175)

解释更改

从 Swift 2 开始(我相信),您必须使用 rawValue 作为 CGBitmapContextCreate 的最后一个参数:

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

此外,在您的移植中,您没有使用 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)

您在 C 风格的 for 循环中所做的位移是针对无效类型。现在在 UInt32 上。我也为你摆脱了 C 风格的循环警告:)

最后,您需要使用它来初始化最终的 UIImage:

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

您尝试使用的类函数无效。

关于CGBitmapInfo 上的 Objective-C 到 Swift 转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37038065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com