我正在使用Photos框架,并创建了一个将过滤器应用于图像的应用程序。现在我没有应用过滤器,而是想在图像上添加文本。此API为我提供了CIImage
,我可以使用它来创建输出CIImage
。我只是不知道如何在特定位置向CIImage
添加文字。如果我是正确的,则不建议将其转换为CGImage
,然后由于性能下降而添加文本。
如何使用现有的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)
}
})
答案 0 :(得分:3)
您可以将灰度文本绘制为单独的CGImage
,将CGImage
转换为CIImage
(通过[+CIImage imageWithCGImage:]
),然后将其用作蒙版,发送它和原始CIImage
到CIBlendWithMask
过滤器。
答案 1 :(得分:1)
从去年开始,有一个名为CIAttributedTextImageGenerator的新CIFilter
。这是一个如何使用它的示例,并包装在一个实用程序类方法中:
+ (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代码足够简单,可以让您理解。