iPhone에서 색상이 지정된 1x1 UIImage를 동적으로 만드는 방법은 무엇입니까?


120

UIColor를 기반으로 동적으로 1x1 UIImage를 만들고 싶습니다.

Quartz2d로이 작업을 신속하게 수행 할 수 있다고 생각하며 기본 사항을 파악하기 위해 문서를 살펴보고 있습니다. 그러나 잠재적 인 함정이 많이있는 것 같습니다. 사물 당 비트 수와 바이트 수를 올바르게 식별하지 못하고, 올바른 플래그를 지정하지 않고, 사용하지 않는 데이터를 공개하지 않는 등입니다.

Quartz 2d (또는 다른 간단한 방법)로 어떻게 안전하게 수행 할 수 있습니까?

답변:


331

당신은 사용할 수 있습니다 CGContextSetFillColorWithColorCGContextFillRect이에 대한 :

빠른

extension UIImage {
    class func image(with color: UIColor) -> UIImage {
        let rect = CGRectMake(0.0, 0.0, 1.0, 1.0)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()

        CGContextSetFillColorWithColor(context, color.CGColor)
        CGContextFillRect(context, rect)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image
    }
}

Swift3

extension UIImage {
    class func image(with color: UIColor) -> UIImage {
        let rect = CGRect(origin: CGPoint(x: 0, y:0), size: CGSize(width: 1, height: 1))
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()!

        context.setFillColor(color.cgColor)
        context.fill(rect)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image!
    }
}

목표 -C

+ (UIImage *)imageWithColor:(UIColor *)color {
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

19
좋은 것 :-)이 메서드를 클래스 메서드로 범주에 넣는 것이 좋습니다. 그러면 프로젝트에 간단히 추가 할 수 있고 [UIImage imageWithColor: [UIColor redColor]].

7
이러한 이미지를 루프로 만들거나 더 큰 크기를 사용하는 경우 최적화는 색상에 알파가있는 경우에만 불투명 캔버스를 사용하는 것입니다. : 이것처럼const CGFloat alpha = CGColorGetAlpha(color.CGColor); const BOOL opaque = alpha == 1; UIGraphicsBeginImageContextWithOptions(size, opaque, 0);
hpique

신속한 버전 제공
fnc12

대신 빠른 초기화를 만드는 방법이 있습니까?
Antzi

1
UIGraphicsGetCurrentContext()돌아 오는 nil거야? 편집 : 나는 통과했다, 그것을 가지고 0에 대한 rectwidth.
Iulian Onofrei 2015-08-27

9

Matt Stephen의 코드를 기반으로 한 또 다른 옵션이 있습니다. 재사용하거나 크기를 변경할 수 있도록 크기 조정 가능한 단색 이미지를 생성합니다 (예 : 배경에 사용).

+ (UIImage *)prefix_resizeableImageWithColor:(UIColor *)color {
    CGRect rect = CGRectMake(0.0f, 0.0f, 3.0f, 3.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    image = [image resizableImageWithCapInsets:UIEdgeInsetsMake(1, 1, 1, 1)];

    return image;
}

UIImage 카테고리에 넣고 접두사를 변경하십시오.


6

나는 Matt Steven의 대답을 여러 번 사용했기 때문에 카테고리를 만들었습니다.

@interface UIImage (mxcl)
+ (UIImage *)squareImageWithColor:(UIColor *)color dimension:(int)dimension;
@end

@implementation UIImage (mxcl)
+ (UIImage *)squareImageWithColor:(UIColor *)color dimension:(int)dimension {
    CGRect rect = CGRectMake(0, 0, dimension, dimension);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}
@end

5

Apple의 최신 UIGraphicsImageRenderer를 사용하면 코드가 매우 작습니다.

import UIKit

extension UIImage {
    static func from(color: UIColor) -> UIImage {
        let size = CGSize(width: 1, height: 1)
        return UIGraphicsImageRenderer(size: size).image(actions: { (context) in
            context.cgContext.setFillColor(color.cgColor)
            context.fill(.init(origin: .zero, size: size))
        })
    }
}

0

나에게 편리한 초기화는 Swift에서 더 깔끔하게 느껴집니다.

extension UIImage {

    convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {

        let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
        UIGraphicsBeginImageContext(rect.size)
        guard let context = UIGraphicsGetCurrentContext() else {
            return nil
        }

        context.setFillColor(color.cgColor)
        context.fill(rect)

        guard let image = context.makeImage() else {
            return nil
        }
        UIGraphicsEndImageContext()

        self.init(cgImage: image)
    }

}

-7

좋아, 정확히 원하는 것은 아니지만이 코드는 선을 그을 것이다. 요점을 만들기 위해 그것을 조정할 수 있습니다. 또는 적어도 그것으로부터 약간의 정보를 얻으십시오.

이미지를 1x1로 만드는 것이 조금 이상해 보입니다. 스트로크는 선을 따라가므로 0.5에서 너비 1.0의 스트로크가 작동합니다. 그냥 놀아요.

- (void)drawLine{

UIGraphicsBeginImageContext(CGSizeMake(320,300));

CGContextRef ctx = UIGraphicsGetCurrentContext();

float x = 0;
float xEnd = 320;
float y = 300;

CGContextClearRect(ctx, CGRectMake(5, 45, 320, 300));

CGContextSetGrayStrokeColor(ctx, 1.0, 1.0);

CGContextSetLineWidth(ctx, 1);
CGPoint line[2] = { CGPointMake(x,y), CGPointMake(xEnd, y) };

CGContextStrokeLineSegments(ctx, line, 2);

UIImage *theImage=UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.