아이폰에서 투명한 PNG 이미지를 염색하는 방법은 무엇입니까?
직사각형 이미지 위에 CGContextFillRect를 그리고 혼합 모드를 설정하면 해당 이미지에 색을 칠할 수 있다는 것을 알고 있습니다.하지만, 저는 아이콘과 같은 투명한 이미지에 틴트를 바르는 방법을 알아낼 수 없습니다.SDK는 이러한 탭 모음에서 자체적으로 수행하므로 가능해야 합니다.누가 스니펫을 제공할 수 있습니까?
업데이트:
이 문제에 대해서는 제가 처음 요청한 이후로 많은 좋은 제안들이 있었습니다.여러분에게 가장 적합한 것을 알아내기 위해 반드시 모든 답을 읽어보세요.
업데이트(2015년 4월 30일):
iOS 7.0을 사용하면 다음과 같은 작업을 수행할 수 있으며, 이는 원래 질문의 요구를 충족시킬 수 있습니다.하지만 더 복잡한 사례가 있다면, 모든 답을 확인하세요.
UIImage *iconImage = [[UIImage imageNamed:@"myImageName"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImageView *icon = [[UIImageView alloc] initWithImage:iconImage];
icon.tintColor = [UIColor redColor];
업데이트: 아래 코드를 사용하는 Swift UIColor 확장에 대한 Gist입니다.
그레이스케일 이미지를 가지고 있으면서 화이트가 틴팅 컬러가 되기를 원한다면,kCGBlendModeMultiply
가는 길입니다.이 방법을 사용하면 색조 색상보다 밝은 하이라이트를 가질 수 없습니다.
반대로 회색조가 아닌 이미지가 있거나 유지해야 하는 강조 표시와 그림자가 있는 경우 혼합 모드를 선택하는 것이 좋습니다.흰색은 흰색으로 유지되고 검은색은 이미지의 밝기가 유지되므로 이미지의 밝기가 유지됩니다.이 모드는 단지 틴팅을 위해 만들어졌습니다 - 이것은 포토샵의 것과 같습니다.Color
레이어 블렌드 모드(레이어: 약간 다른 결과가 발생할 수 있음).
알파 픽셀을 썬팅하는 것은 iOS에서도 포토샵에서도 제대로 작동하지 않습니다. 반투명 검은색 픽셀은 검은색으로 유지되지 않습니다.저는 그 문제를 해결하기 위해 아래 답변을 업데이트했는데, 확인하는 데 시간이 꽤 걸렸습니다.
모드 중 .kCGBlendModeSourceIn/DestinationIn
에 CGContextClipToMask
.
당신이 경우는려를 .UIImage
다음 코드 섹션은 각각 다음 코드로 둘러싸일 수 있습니다.
UIGraphicsBeginImageContextWithOptions (myIconImage.size, NO, myIconImage.scale); // for correct resolution on retina, thanks @MobileVet
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, 0, myIconImage.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGRect rect = CGRectMake(0, 0, myIconImage.size.width, myIconImage.size.height);
// image drawing code here
UIImage *coloredImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
그래서 여기 투명한 이미지에 색을 입히는 코드가 있습니다.kCGBlendModeColor
:
// draw black background to preserve color of transparent pixels
CGContextSetBlendMode(context, kCGBlendModeNormal);
[[UIColor blackColor] setFill];
CGContextFillRect(context, rect);
// draw original image
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGContextDrawImage(context, rect, myIconImage.CGImage);
// tint image (loosing alpha) - the luminosity of the original image is preserved
CGContextSetBlendMode(context, kCGBlendModeColor);
[tintColor setFill];
CGContextFillRect(context, rect);
// mask by alpha values of original image
CGContextSetBlendMode(context, kCGBlendModeDestinationIn);
CGContextDrawImage(context, rect, myIconImage.CGImage);
이미지에 반투명 픽셀이 없는 경우 다음을 사용하여 반대로 수행할 수도 있습니다.
// draw tint color
CGContextSetBlendMode(context, kCGBlendModeNormal);
[tintColor setFill];
CGContextFillRect(context, rect);
// replace luminosity of background (ignoring alpha)
CGContextSetBlendMode(context, kCGBlendModeLuminosity);
CGContextDrawImage(context, rect, myIconImage.CGImage);
// mask by alpha values of original image
CGContextSetBlendMode(context, kCGBlendModeDestinationIn);
CGContextDrawImage(context, rect, myIconImage.CGImage);
색상으로 색조를 지정해야 하는 알파 채널이 있는 이미지를 얻었기 때문에 밝기를 신경 쓰지 않는 경우 보다 효율적인 방법으로 이미지를 만들 수 있습니다.
// draw tint color
CGContextSetBlendMode(context, kCGBlendModeNormal);
[tintColor setFill];
CGContextFillRect(context, rect);
// mask by alpha values of original image
CGContextSetBlendMode(context, kCGBlendModeDestinationIn);
CGContextDrawImage(context, rect, myIconImage.CGImage);
또는 그 반대의 경우:
// draw alpha-mask
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGContextDrawImage(context, rect, myIconImage.CGImage);
// draw tint color, preserving alpha values of original image
CGContextSetBlendMode(context, kCGBlendModeSourceIn);
[tintColor setFill];
CGContextFillRect(context, rect);
재미있게 보내!
저는 이 방법으로 가장 성공을 거두었습니다. 왜냐하면 제가 시도한 다른 방법들은 특정 색 조합에 대한 반투명 픽셀의 왜곡된 색을 유발했기 때문입니다.이것은 또한 성능 측면에서도 약간 더 나을 것입니다.
+ (UIImage *) imageNamed:(NSString *) name withTintColor: (UIColor *) tintColor {
UIImage *baseImage = [UIImage imageNamed:name];
CGRect drawRect = CGRectMake(0, 0, baseImage.size.width, baseImage.size.height);
UIGraphicsBeginImageContextWithOptions(baseImage.size, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, 0, baseImage.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
// draw original image
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGContextDrawImage(context, drawRect, baseImage.CGImage);
// draw color atop
CGContextSetFillColorWithColor(context, tintColor.CGColor);
CGContextSetBlendMode(context, kCGBlendModeSourceAtop);
CGContextFillRect(context, drawRect);
UIImage *tintedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return tintedImage;
}
검색한 결과, 지금까지 나온 가장 좋은 해결책은 블렌드 모드와 클리핑 마스크를 함께 사용하여 투명 PNG에 색을 입히고 색을 입히는 것입니다.
CGContextSetBlendMode (context, kCGBlendModeMultiply);
CGContextDrawImage(context, rect, myIconImage.CGImage);
CGContextClipToMask(context, rect, myIconImage.CGImage);
CGContextSetFillColorWithColor(context, tintColor);
CGContextFillRect(context, rect);
kCGBlendModeOverlay를 사용하면 Apple 탐색 모음의 색조에 매우 가까운 결과를 얻을 수 있습니다.https://stackoverflow.com/a/4684876/229019 의 이 게시물에서 @mosz 접근 방식을 결합하여 우수한 @mosbb 답변을 얻었으며, 이 솔루션을 통해 제가 기대했던 결과를 얻었습니다.
- (UIImage *)tintedImageUsingColor:(UIColor *)tintColor;
{
UIGraphicsBeginImageContextWithOptions (self.size, NO, [[UIScreen mainScreen] scale]);
CGContextRef context = UIGraphicsGetCurrentContext();
CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
// draw original image
[self drawInRect:rect blendMode:kCGBlendModeNormal alpha:1.0f];
// tint image (loosing alpha).
// kCGBlendModeOverlay is the closest I was able to match the
// actual process used by apple in navigation bar
CGContextSetBlendMode(context, kCGBlendModeOverlay);
[tintColor setFill];
CGContextFillRect(context, rect);
// mask by alpha values of original image
[self drawInRect:rect blendMode:kCGBlendModeDestinationIn alpha:1.0f];
UIImage *tintedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return tintedImage;
}
다음은 투명도를 사용하여 여러 그레이스케일 이미지를 색조화하는 예입니다.
:
- 첫 번째 줄은 [UIColor orangeColor] 색상이 지정된 사과 도구 모음입니다.
- 두 번째 선은 선명한 색상(= 실제 그라데이션)으로 시작하여 동일한 주황색으로 끝나는 몇 가지 색상의 동일한 그라데이션입니다.
- 세번째는 투명한 심플한 원입니다 (린넨이 배경색입니다)
- 네 번째 줄은 복잡하고 어둡고 시끄러운 질감입니다.
UI 이미지 범주를 생성하고 다음과 같이 수행할 수 있습니다.
- (instancetype)tintedImageWithColor:(UIColor *)tintColor {
UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0);
CGContextRef context = UIGraphicsGetCurrentContext();
CGRect rect = (CGRect){ CGPointZero, self.size };
CGContextSetBlendMode(context, kCGBlendModeNormal);
[self drawInRect:rect];
CGContextSetBlendMode(context, kCGBlendModeSourceIn);
[tintColor setFill];
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
iOS7에서는 UIImageView에 tintColor 속성을 도입하고 UIImage에 렌더링 모드를 도입했습니다.https://stackoverflow.com/a/19125120/1570970 에서 예를 참조
iOS 7.0에서는 다음과 같이 기본 UIImageView에 색을 칠할 수도 있습니다.
UIImage *iconImage = [[UIImage imageNamed:@"myImageName"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImageView *icon = [[UIImageView alloc] initWithImage:iconImage];
icon.tintColor = [UIColor redColor];
팹의 승인된 답변에서 UI 이미지를 만들기 위한 "주변" 코드가 망막 화면의 이미지 해상도를 잘못 제공했다는 점에 유의하십시오.수정할 내용, 변경할 내용:
UIGraphicsBeginImageContext(myIconImage.size);
대상:
UIGraphicsBeginImageContextWithOptions(myIconImage.size, NO, 0.0);
Apple 설명서에 따르면 0.0으로 설정된 마지막 매개 변수는 스케일입니다.
"0.0의 값을 지정하면 스케일 팩터가 장치의 기본 화면의 스케일 팩터로 설정됩니다."
댓글을 달 수 있는 권한이 없고, 편집이 좀 무례한 것 같아서 답변에서 언급합니다.누군가가 이 같은 문제를 마주칠 경우를 대비해요.
UIImageView(또는 해당 항목에 대한 보기)의 배경색은 RGBA입니다.색깔의 알파는 새로운 것을 발명하지 않고도 여러분이 필요로 하는 것을 할 수 있습니다.
제 일은 아니지만, 저는 이 접근 방식을 성공적으로 사용했습니다.
http://coffeeshopped.com/2010/09/iphone-how-to-dynamically-color-a-uiimage
사용자 지정 UIButton 하위 클래스에서 이미지 보기를 음영 처리하려고 했지만 다른 솔루션이 원하는 대로 작동하지 않았습니다.저는 이미지 색상을 어둡게 해야 했습니다.코어 이미지를 사용하여 밝기를 변경하는 방법은 다음과 같습니다.
프로젝트의 라이브러리에 CoreImage.framework를 추가해야 합니다.(바이너리를 라이브러리와 연결)
UI 이미지 음영 방법
- (UIImage *)shadeImage:(UIImage *)image { CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage]; CIContext *context = [CIContext contextWithOptions:nil]; CIFilter *filter = [CIFilter filterWithName:@"CIColorControls" keysAndValues:kCIInputImageKey, inputImage, @"inputBrightness", [NSNumber numberWithFloat:-.5], nil]; CIImage *outputImage = [filter outputImage]; CGImageRef cgImage = [context createCGImage:outputImage fromRect:[outputImage extent]]; UIImage *newImage = [UIImage imageWithCGImage:cgImage scale:image.scale orientation:image.imageOrientation]; CGImageRelease(cgImage); return newImage; }
컨텍스트의 복사본을 재생성하는 대신 ivar로 저장할 수 있습니다.
스택 오버플로에 대한 어떤 대답도 도움이 되지 않습니다. 디자이너는 다양한 형태, 다양한 알파 값(및 "알파홀")으로 UI 요소를 그립니다.대부분의 경우 이 파일은 (가능한 모든 강도의) 흑백 픽셀로 구성된 알파 채널이 있는 32비트 PNG 파일입니다.그런 그림에 색을 입힌 후에 저는 이 색을 칠한 결과를 얻어야 했습니다. 흰색 픽셀은 더 많이, 어두운 픽셀은 더 적게.그리고 알파 채널의 관점에서 이 모든 것.그리고 UIImage 카테고리를 위해 이 방법을 썼습니다.효율성이 높지 않을 수도 있지만 시계 역할을 합니다.
- (UIImage *)imageTintedWithColor:(UIColor *)color {
UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
CGContextRef context = UIGraphicsGetCurrentContext();
CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
CGContextSetBlendMode(context, kCGBlendModeCopy);
[color setFill];
CGContextFillRect(context, rect);
[self drawInRect:rect blendMode:kCGBlendModeXOR alpha:1.0];
CGContextSetBlendMode(context, kCGBlendModeXOR);
CGContextFillRect(context, rect);
[self drawInRect:rect blendMode:kCGBlendModeMultiply alpha:1.0];
UIImage *coloredImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return coloredImage;
}
먼저 투명 아이콘을 반쯤 염색하는 작업을 수행하는 데 도움이 된 탁월한 솔루션에 대해 팹에게 감사드립니다.C#(Monotouch)에 대한 솔루션이 필요했기 때문에 그의 코드를 번역해야 했습니다.여기 제가 생각해 낸 것이 있습니다.이것을 당신의 코드에 복사해서 붙여넣고 당신의 절반의 투명한 이미지와 당신의 완성된 것을 추가하세요.
그래서 다시 모든 학점은 팹으로 갑니다.이것은 단지 시작 C# 사용자들을 차기 위한 것입니다 :)
//TINT COLOR IMAGE
UIImageView iImage = new UIImageView(new RectangleF(12, 14, 24,24));
iImage.ContentMode = UIViewContentMode.ScaleAspectFit;
iImage.Image = _dataItem.Image[0] as UIImage;
UIGraphics.BeginImageContextWithOptions(iImage.Bounds.Size, false, UIScreen.MainScreen.Scale);
CGContext context = UIGraphics.GetCurrentContext();
context.TranslateCTM(0, iImage.Bounds.Size.Height);
context.ScaleCTM(1.0f, -1.0f);
RectangleF rect = new RectangleF(0,0, iImage.Bounds.Width, iImage.Bounds.Height);
// draw black background to preserve color of transparent pixels
context.SetBlendMode(CGBlendMode.Normal);
UIColor.Black.SetFill();
context.FillRect(rect);
// draw original image
context.SetBlendMode(CGBlendMode.Normal);
context.DrawImage(rect, iImage.Image.CGImage);
// tint image (loosing alpha) - the luminosity of the original image is preserved
context.SetBlendMode(CGBlendMode.Color);
UIColor.Orange.SetFill();
context.FillRect(rect);
// mask by alpha values of original image
context.SetBlendMode(CGBlendMode.DestinationIn);
context.DrawImage(rect, iImage.Image.CGImage);
UIImage coloredImage = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
iImage = new UIImageView(coloredImage);
iImage.Frame = new RectangleF(12, 14, 24,24);
//END TINT COLOR IMAGE
cell.Add(iImage);
언급URL : https://stackoverflow.com/questions/3514066/how-to-tint-a-transparent-png-image-in-iphone
'programing' 카테고리의 다른 글
Angular CLI에서 상대 경로 방지 (0) | 2023.08.16 |
---|---|
C에서 %f와 %lf의 차이는 무엇입니까? (0) | 2023.08.16 |
반투명 배경을 만들려면 어떻게 해야 합니까? (0) | 2023.08.16 |
HTML/CSS를 사용하여 텍스트에 공백/탭을 삽입하는 방법 (0) | 2023.08.16 |
Python 스크립트에서 PowerShell 함수 실행 (0) | 2023.08.16 |