4

iOS でこのようなピクセル化トランジション(アニメーション gif) をどのように実装しますか?

Core Animationで実装することは可能ですか?

4

3 に答える 3

2

C4 - Travis のコメントは正しいです。あなたの最善の選択肢は、おそらく自分でアニメーションをライブでレンダリングすることです。スクリーン キャプチャ用にQA1703のコードを使用する必要がありますが、 で作成するコンテキストのサイズを調整し、UIGraphicsBeginImageContextWithOptionsへの呼び出しの直後に Core Graphics の現在の変換行列 (CTM) を適切に変更しUIGraphicsGetCurrentContextます。したがって、これを書きながら入力するだけで、調整すると次のようになります。

- (UIImage*)screenshotWithScale:(CGFloat)scale
{
    // Create a graphics context with the target size
    // On iOS 4 and later, use UIGraphicsBeginImageContextWithOptions to take the scale into consideration
    // On iOS prior to 4, fall back to use UIGraphicsBeginImageContext
    CGSize imageSize = [[UIScreen mainScreen] bounds].size;

    /* YOU'VE ADDED: */
    imageSize.width *= scale;
    imageSize.height *= scale;

    if (NULL != UIGraphicsBeginImageContextWithOptions)
    /* ... then stuff as per the original, down to ... */

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextScaleCTM(context, scale, scale);

    // Iterate over every window from back to front
    for (UIWindow *window in [[UIApplication sharedApplication] windows]) 
        /* etc, etc, down to... */

     // Retrieve the screenshot image
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    CGContextRestoreGState(context);
    UIGraphicsEndImageContext();

    return image;
}

スケール = 1.0 を使用UIImageすると、画面とまったく同じ値が返されます。スケール = 0.5 の場合、縦横のピクセル数が半分になり、スケール = 0.25 の場合、縦横のピクセル数が 4 分の 1 になります。

次に、それを に入れ、UIImageそのUIImageViewレイヤーの倍率フィルターを に設定しkCAFilterNearestます。その画像ビューを表示すると、オリジナルの意図的にピクセル化されたバージョンが表示されます。次に、怠惰になって、すでに画面に表示されているものの半分のサイズのレンダリングを実行し続けるか (最初はライブ ビュー、その後はイメージ ビュー)、メイン ウィンドウからではなく、指定されたウィンドウからレンダリングするようにコードを適応させることができます。必要に応じて、元のビュー階層から表示および再レンダリングします (これは、スケールを整数で分割し続ける以外のことをしたい場合に機能します)。

于 2012-03-27T22:41:25.747 に答える
2

トランジションでこれを使用する良い方法についてはわかりませんが、コンテンツの静止画像を (UIImage として) キャプチャできれば、時間アニメーション ピクセル化フィルターを実行して上記の効果を生成できるはずです。 .

この回答でGPUImagePixellateFilter の例を示します。これfractionalWidthOfAPixelは、タイマーのプロパティを調整すると、このような効果を生み出す可能性があります。

静止画像の場合、UIImage を GPUImagePicture として取り込み、ピクセル化フィルターを介して GPUImageView にチェーンする必要があります。ピクセル幅を更新するたび-processImageに、画像ソースを呼び出して画面上の画像を更新する必要があります。初期設定と画像のアップロード後、このアニメーションは、OpenGL ES 2.0 をサポートするすべての iOS デバイスで 60 FPS で実行されます。

于 2012-03-27T22:42:38.793 に答える
2

Core Image Filter Reference に記載されている CIPixellate および CIHexagonalPixellate フィルターがありますが、これらは現在 OSX でのみ使用できます...残念ながら iOS では使用できません。

http://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CoreImageFilterReference/Reference/reference.html

于 2012-03-27T22:18:15.350 に答える