首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何向CIImage添加文本?

如何向CIImage添加文本?
EN

Stack Overflow用户
提问于 2014-09-01 23:46:30
回答 2查看 2.7K关注 0票数 5

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

如何使用现有的CIImage输出完全相同的CIImage (保持原始图像质量),并将文本放在特定的位置上?

代码语言:javascript
复制
//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)
    }
})
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-02 00:33:04

您可以将灰度文本绘制成单独的CGImage,将CGImage转换为CIImage (通过[+CIImage imageWithCGImage:]),然后使用它作为掩码,将其和原始CIImage发送到CIBlendWithMask过滤器。

票数 4
EN

Stack Overflow用户

发布于 2020-09-01 23:51:30

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

代码语言:javascript
复制
+ (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;
}

不幸的是,似乎有一个bug不允许您为随后调用此筛选器选择新的颜色。IOW,一旦您渲染此过滤器一次,每个后续呈现都将产生与第一次呈现相同颜色的文本,而不管您传递的是什么颜色。

无论如何,这将产生一个CIImage,然后您可以将其覆盖到inputImage上,如下所示:

代码语言:javascript
复制
CIImage *textImage = [YourUtilityClass imageWithText:@"Some text" color:[CIColor whiteColor] scaleFactor:1.0];
CIImage *outputImage = [textImage imageByCompositingOverImage:inputImage];

我最近没有很多使用Swift的经验,但希望这个目标-C代码足够简单,让您了解这个想法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25614057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档