3

写真フレームワークを使用しており、画像にフィルターを適用するアプリを作成しました。フィルターを適用する代わりに、画像の上にテキストを追加します。この 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)
    }
})
4

2 に答える 2

3

グレースケールのテキストを別の に描画し、 を( 経由で)CGImageに変換してから、それをマスクとして使用し、元のテキストをフィルターに送信できます。CGImageCIImage[+CIImage imageWithCGImage:]CIImageCIBlendWithMask

于 2014-09-02T00:33:04.563 に答える
1

昨年の時点で、CIAttributedTextImageGeneratorCIFilterと呼ばれる新しい利用可能なものがあります。これは、ユーティリティ クラス メソッドにまとめられた、私が使用した方法の例です。

+ (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 に答える