1. ホーム
  2. uiimage

[解決済み】Retinaディスプレイで画質を落とさずにUIViewからUIImageにキャプチャする方法

2022-03-30 05:08:07

質問

私のコードは、通常のデバイスでは問題なく動作しますが、網膜デバイスではぼやけた画像が作成されます。

どなたか解決策をご存じないでしょうか?

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

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;
}

解決方法は?

の使用から UIGraphicsBeginImageContext から UIGraphicsBeginImageContextWithOptions (文書化された このページでは ). scale (第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
}