Retinaディスプレイで品質を落とさずにUIViewをUIImageにキャプチャする方法 質問する

Retinaディスプレイで品質を落とさずにUIViewをUIImageにキャプチャする方法 質問する

私のコードは通常のデバイスでは正常に動作しますが、Retina デバイスではぼやけた画像が作成されます。

私の問題の解決策を知っている人はいますか?

+ (UIImage *) imageWithView:(UIView *)view
{
    UIGraphicsBeginImageContext(view.bounds.size);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;
}

ベストアンサー1

UIGraphicsBeginImageContextの使用をUIGraphicsBeginImageContextWithOptions(文書に記載されているように)に切り替えるこのページ)。スケール (3 番目の引数) に 0.0 を渡すと、画面のスケール係数と同じスケール係数を持つコンテキストが取得されます。

UIGraphicsBeginImageContext固定スケール係数 1.0 を使用するため、iPhone 4 でも他の iPhone とまったく同じ画像が得られます。暗黙的に拡大したときに iPhone 4 がフィルターを適用しているか、または周囲のものよりも鮮明でないことを脳が認識しているかのどちらかでしょう。

だから、私はこう思う:

#import <QuartzCore/QuartzCore.h>

+ (UIImage *)imageWithView:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;
}

Swift 4 では次のようになります。

func image(with view: UIView) -> UIImage? {
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0.0)
    defer { UIGraphicsEndImageContext() }
    if let context = UIGraphicsGetCurrentContext() {
        view.layer.render(in: context)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        return image
    }
    return nil
}

おすすめ記事