web-dev-qa-db-ja.com

網膜ディスプレイ用のCoreGraphics

次のコードを使用して、ロードした画像に対していくつかの操作を実行していますが、Retinaディスプレイ上にあると、ディスプレイがぼやけてしまうことがわかりました。

- (UIImage*)createImageSection:(UIImage*)image section:(CGRect)section

{
float originalWidth = image.size.width ;
float originalHeight = image.size.height ;
int w = originalWidth * section.size.width;
int h = originalHeight * section.size.height;

CGContextRef ctx = CGBitmapContextCreate(nil, w, h, 8, w * 8,CGImageGetColorSpace([image CGImage]), kCGImageAlphaPremultipliedLast);
CGContextClearRect(ctx, CGRectMake(0, 0, originalWidth * section.size.width, originalHeight * section.size.height)); // w + h before
CGContextTranslateCTM(ctx, (float)-originalWidth * section.Origin.x, (float)-originalHeight * section.Origin.y);
CGContextDrawImage(ctx, CGRectMake(0, 0, originalWidth, originalHeight), [image CGImage]);
CGImageRef cgImage = CGBitmapContextCreateImage(ctx);
UIImage* resultImage = [[UIImage alloc] initWithCGImage:cgImage];

CGContextRelease(ctx);
CGImageRelease(cgImage);

return resultImage;
}

これを変更して網膜と互換性を持たせるにはどうすればよいですか。

よろしくお願いします

最高、DV

30
DKV

CGImagesはデバイスの網膜性を考慮していないため、自分で考慮する必要があります。

これを行うには、CoreGraphicsルーチンで使用するすべての座標とサイズに入力画像のscaleプロパティ(Retinaデバイスでは2.0)を掛けて、すべての操作を2倍の解像度で実行できるようにする必要があります。 。

次に、resultImageの初期化を変更してinitWithCGImage:scale:orientation:を使用し、同じ倍率を入力する必要があります。これが、Retinaデバイスがピクセル倍の解像度ではなくネイティブ解像度で出力をレンダリングする理由です。

48
grahamparks

答えてくれてありがとう、助けてくれた!とにかく明確にするために、OPによるコードは次のように変更する必要があります。

- (UIImage*)createImageSection:(UIImage*)image section:(CGRect)section        
{
    CGFloat scale = [[UIScreen mainScreen] scale]; ////// ADD

    float originalWidth = image.size.width ;
    float originalHeight = image.size.height ;
    int w = originalWidth * section.size.width *scale; ////// CHANGE
    int h = originalHeight * section.size.height *scale; ////// CHANGE

    CGContextRef ctx = CGBitmapContextCreate(nil, w, h, 8, w * 8,CGImageGetColorSpace([image CGImage]), kCGImageAlphaPremultipliedLast);
    CGContextClearRect(ctx, CGRectMake(0, 0, originalWidth * section.size.width, originalHeight * section.size.height)); // w + h before
    CGContextTranslateCTM(ctx, (float)-originalWidth * section.Origin.x, (float)-originalHeight * section.Origin.y);

    CGContextScaleCTM(UIGraphicsGetCurrentContext(), scale, scale); ////// ADD

    CGContextDrawImage(ctx, CGRectMake(0, 0, originalWidth, originalHeight), [image CGImage]);
    CGImageRef cgImage = CGBitmapContextCreateImage(ctx);
    UIImage* resultImage = [[UIImage alloc] initWithCGImage:cgImage];

    CGContextRelease(ctx);
    CGImageRelease(cgImage);

    return resultImage;
}
5
GeneCode

Swiftバージョン:

    let scale = UIScreen.mainScreen().scale

    CGContextScaleCTM(UIGraphicsGetCurrentContext(), scale, scale)
2
ioopl