2

ウォッチ番号を表す円の中に 12 個の画像を描画したいのですが、透明な境界線を持つ画像に関する stackoverflow のすべてのトピックを読みましたが、私の場合は機能しません

-(UIImage *)addImageNumber_:(UIImage *)img {

    int w = img.size.width;
    int h = img.size.height;

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);
    CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage);
    CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1);
    CGContextSetShouldAntialias(context,YES);
    CGContextSetAllowsAntialiasing( context ,YES );
    CGAffineTransform transform;

    for (int x=0; x<=11; x++) {

        UIImage *timg1 = [UIImage imageNamed:@"2.png"];

        CGRect imageRect = CGRectMake(0, 0, timg1.size.width+2, timg1.size.height+2);
        UIGraphicsBeginImageContext(imageRect.size);
        [timg1 drawInRect:CGRectMake(1,1,timg1.size.width,timg1.size.height)];
        timg1 = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        transform = CGAffineTransformIdentity;

        CGContextDrawImage(context, CGRectMake((w-26)/2, 0, 26, 30), timg1.CGImage);

        transform = CGAffineTransformConcat(transform, CGAffineTransformMakeTranslation(-w/2, -w/2));
        transform = CGAffineTransformConcat(transform, CGAffineTransformMakeRotation(radians(30)));
        transform = CGAffineTransformConcat(transform, CGAffineTransformMakeTranslation(w/2, w/2));

        CGContextConcatCTM(context, transform);
    }

    CGImageRef imageMasked = CGBitmapContextCreateImage(context);
    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);
    return [UIImage imageWithCGImage:imageMasked];
}
UIViewEdgeAntialiasing = YES;
UIImage *img = [UIImage imageNamed:@"test.png"];
UIImage *img2 = [self addImageNumber_:img ];
R1.image = img2;
[self.view addSubview:R1];

test img は時計の背景、2.png は透明な境界線を持つ透明な png です。

ここに画像の説明を入力

12 時と 6 時の数字は回転していないので問題ないように見えますが、残りはギザギザです

テキストで描く

4

3 に答える 3

6

決して言わないでくださいUIGraphicsBeginImageContext(imageRect.size)。言うUIGraphicsBeginImageContextWithOptions(imageRect.size, NO, 0)。そうすれば、2倍の解像度の画面で、2倍の解像度のグラフィックスコンテキストを取得できます。

解像度の値を4にして、解像度をさらに上げることもできます。

もちろん、「2」の事前に描画された画像から始めているという事実は、解像度を制限する可能性があります。雌豚の耳から絹の財布を作ることはできません。「2」を最初から文字列として描く方がはるかに良いでしょう。

于 2013-01-18T19:29:34.277 に答える
0

試す

CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
于 2013-01-18T19:16:15.417 に答える
0

スウィフト 3:

context!.interpolationQuality = .high
于 2017-08-12T16:24:32.107 に答える