3

我正在使用 Photos 框架并创建了一个应用程序,它将对图像应用过滤器。现在,我不想应用过滤器,而是想在图像顶部添加文本。这个 API 为我提供了一个CIImage可以用来创建输出的 API CIImage。我只是不知道如何将特定位置的文本添加到CIImage. 如果我是正确的,由于性能下降,不建议将其转换为 aCGImage然后添加文本。

一个人怎么能使用现有的CIImage来输出完全相同的CIImage(保留原始图像质量),文本放在特定位置的顶部?

//Get full image
let url = contentEditingInput.fullSizeImageURL
let orientation = contentEditingInput.fullSizeImageOrientation
var inputImage = CIImage(contentsOfURL: url)
inputImage = inputImage.imageByApplyingOrientation(orientation)

//TODO: REPLACE WITH TEXT OVERLAY
/*//Add filter
let filterName = "CISepiaTone"
let filter = CIFilter(name: filterName)
filter.setDefaults()
filter.setValue(inputImage, forKey: kCIInputImageKey)
let outputImage: CIImage = filter.outputImage*/

//Create editing output
let jpegData: NSData = self.jpegRepresentationOfImage(outputImage)
let adjustmentData = PHAdjustmentData(formatIdentifier: AdjustmentFormatIdentifier, formatVersion: "1.0", data: filterName.dataUsingEncoding(NSUTF8StringEncoding))

let contentEditingOutput = PHContentEditingOutput(contentEditingInput: contentEditingInput)
jpegData.writeToURL(contentEditingOutput.renderedContentURL, atomically: true)
contentEditingOutput.adjustmentData = adjustmentData

PHPhotoLibrary.sharedPhotoLibrary().performChanges({ () -> Void in
    let request = PHAssetChangeRequest(forAsset: asset)
request.contentEditingOutput = contentEditingOutput
}, completionHandler: { (success: Bool, error: NSError!) -> Void in
    if !success {
        NSLog("Error saving image: %@", error)
    }
})
4

2 回答 2

3

您可以将灰度文本绘制成单独的CGImage,将其CGImage转换为CIImage(via [+CIImage imageWithCGImage:]),然后将其用作蒙版,将其和原始文本发送CIImageCIBlendWithMask过滤器。

于 2014-09-02T00:33:04.563 回答
1

截至去年,有一个CIFilter名为CIAttributedTextImageGenerator的新可用。这是我如何使用它的示例,包含在实用程序类方法中:

+ (CIImage *)imageWithText:(NSString *)message color:(CIColor *)color scaleFactor:(CGFloat)scaleFactor
{
    NSDictionary *attributes = @{
        NSForegroundColorAttributeName : CFBridgingRelease(CGColorCreateSRGB(color.red, color.green, color.blue, color.alpha)),
    };
    NSAttributedString *text = [[NSAttributedString alloc] initWithString:message attributes:attributes];

    CIFilter<CIAttributedTextImageGenerator> *filter = [CIFilter attributedTextImageGeneratorFilter];
    filter.text = text;
    filter.scaleFactor = scaleFactor;

    CIImage *result = filter.outputImage;
    return result;
}

不幸的是,似乎有一个错误不允许您为后续调用此过滤器选择新颜色。IOW,一旦您渲染此过滤器一次,每次后续渲染都会生成与第一次渲染相同颜色的文本,无论您传入什么颜色。

无论如何,这将产生一个CIImage你可以覆盖到你inputImage喜欢的东西:

CIImage *textImage = [YourUtilityClass imageWithText:@"Some text" color:[CIColor whiteColor] scaleFactor:1.0];
CIImage *outputImage = [textImage imageByCompositingOverImage:inputImage];

我最近没有太多使用 Swift 的经验,但希望这段 Objective-C 代码足够简单,让你明白这一点。

于 2020-09-01T23:51:30.637 回答