-1

額縁 (ボーダー) を表示するリソース (.png ファイル) があります。
この .png ファイルのサイズは 100x100px で、境界線の幅は 10px です。

私の元のイメージ

私の質問:

境界線の幅を損なうことなく、この画像から別のサイズの別の UIImage を作成するにはどうすればよいですか?

問題:

元の画像から新しい画像を描画しようとするCGContextDrawImage と、新しいサイズの新しい画像が得られますが、境界線の比率が台無しです。

        CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newWidth, newHeight));
        CGImageRef imageRef = //... the image

        // Build a context that's the same dimensions as the new size
        CGContextRef bitmap = CGBitmapContextCreate(NULL,
                                                    newRect.size.width,
                                                    newRect.size.height,
                                                    CGImageGetBitsPerComponent(imageRef),
                                                    0,
                                                    CGImageGetColorSpace(imageRef),
                                                    CGImageGetBitmapInfo(imageRef));


        // Set the quality level to use when rescaling
        CGContextSetInterpolationQuality(bitmap, kCGInterpolationHigh);

        // Draw into the context; this scales the image
        CGContextDrawImage(bitmap, newRect, imageRef);

        // Get the resized image from the context and a UIImage
        CGImageRef newImageRef = CGBitmapContextCreateImage(bitmap);
        UIImage *newImage = [UIImage imageWithCGImage:newImageRef];

        // Clean up
        CGContextRelease(bitmap);
        CGImageRelease(newImageRef);

たとえば、800x100p の画像サイズを作成しようとすると、上下の境界線が非常に細い画像が表示されます。

私が得る悪い結果

私が必要とするのは、境界線が同じ幅のままであることです
ここに画像の説明を入力

*注意
ディスクに保存するには、新しいサイズの新しいイメージが必要なので、 を使用しresizableImageWithCapInsets:ても役に立ちません。

4

1 に答える 1

1

resizableImageWithCapInsets を使用できます。

UIImage *img = [UIImage imageNamed:@"myResource"];
img = [img resizableImageWithCapInsets:UIEdgeInsetsMake(10,10,10,10)];

CGContextDrawImage でこのアプローチを使用したことはありませんが、うまくいくはずです。

于 2013-03-10T15:51:48.247 に答える