내 iPhone 앱에는 UIImage 인스턴스가 있습니다. UIImage의 파생 된 UIImage를 얻고 싶습니다.이 UIImage는 첫 번째 UIImage의 결과 중 하나 (예 : 자홍색)가 투명 해지는 결과입니다. 어떻게해야합니까?UIImage에서 한 색상을 투명하게 만드는 방법은 무엇입니까?
답변
-(void)changeColor
{
UIImage *temp23=[UIImage imageNamed:@"leaf.png"];
CGImageRef ref1=[self createMask:temp23];
const float colorMasking[6] = {1.0, 2.0, 1.0, 1.0, 1.0, 1.0};
CGImageRef New=CGImageCreateWithMaskingColors(ref1, colorMasking);
UIImage *resultedimage=[UIImage imageWithCGImage:New];
}
-(CGImageRef)createMask:(UIImage*)temp
{
CGImageRef ref=temp.CGImage;
int mWidth=CGImageGetWidth(ref);
int mHeight=CGImageGetHeight(ref);
int count=mWidth*mHeight*4;
void *bufferdata=malloc(count);
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
CGContextRef cgctx = CGBitmapContextCreate (bufferdata,mWidth,mHeight, 8,mWidth*4, colorSpaceRef, kCGImageAlphaPremultipliedFirst);
CGRect rect = {0,0,mWidth,mHeight};
CGContextDrawImage(cgctx, rect, ref);
bufferdata = CGBitmapContextGetData (cgctx);
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, bufferdata, mWidth*mHeight*4, NULL);
CGImageRef savedimageref = CGImageCreate(mWidth,mHeight, 8, 32, mWidth*4, colorSpaceRef, bitmapInfo,provider , NULL, NO, renderingIntent);
CFRelease(colorSpaceRef);
return savedimageref;
}
위의 코드를 테스트하고 난 당신의 기능의 사용 후 마스크
나는 이런 자신을 전혀 해 본 적이 없지만, CGImageCreateWithMaskingColors
이 여기에 유용 할 것 같습니다. Core Graphics를 사용하는 것은이 사이트의 대답에서 설명 할 수있는 범위를 벗어납니다. 문서를보고 웹에서 자습서를 검색하십시오.
를 사용하여 붉은 색으로 녹색을 변경, 나는
:)있는 UIImage에 대한 배경을 투명하게 만드는 더 간단한 방법을 발견예를 들어 검정색 배경의 PNG 이미지가 있고 화면에서이 배경을 투명하게 만들려는 경우입니다.
이 작업을 시도 할 수 있습니다 : 투명 배경
UIImage * image = [UIImage imageNamed:@"image.png"];
const CGFloat colorMasking[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
image = [UIImage imageWithCGImage: CGImageCreateWithMaskingColors(image.CGImage, colorMasking)];
당신은 가지고 이미지를.
모두가
이 기능이 작동 할 수 있습니다!
-(UIImage *)changeWhiteColorTransparent: (UIImage *)image
{
CGImageRef rawImageRef=image.CGImage;
const float colorMasking[6] = {222, 255, 222, 255, 222, 255};
UIGraphicsBeginImageContext(image.size);
CGImageRef maskedImageRef=CGImageCreateWithMaskingColors(rawImageRef, colorMasking);
{
//if in iphone
CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 0.0, image.size.height);
CGContextScaleCTM(UIGraphicsGetCurrentContext(), 1.0, -1.0);
}
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, image.size.width, image.size.height), maskedImageRef);
UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
CGImageRelease(maskedImageRef);
UIGraphicsEndImageContext();
return result;
}
Brilliant! 방금 요청한 것이 었습니다. 상자에서 일했습니다! 감사. – PKCLsoft
이렇게하면 전체 이미지가 투명 해집니다. 내가 놓친 게 있니? –
확인. 시도해 본 결과, 얼마나 많은 버전의 솔루션이 있는지 알지 못했지만, 나만의 맞춤형 버전이 있습니다. 내가 찾은 바는 @yubenyi의 솔루션이 아주 잘 작동하지만, changeWhiteColorTransparent() 함수의 출력을 가져 와서 다시 전달하려는 경우 작동하지 않는다는 것입니다.
내 첫 번째 단계는 발신자가 투명하게 만들 수있는 다양한 색상을 지정할 수 있도록 특정 색상 및 공차를 허용하도록 기능을 변경하는 것이 었습니다. 이것은 거의 변함없이 잘 동작했지만 출력이 두 번째 색상 범위의 동일한 코드를 통과하는 데 유효한 이미지가 아니라는 사실을 발견했습니다.
많은 시행 착오 끝에 색상 교체 작업을 직접 수행했습니다. 나는이 일을하기위한 API가있을 때 너무 힘들어 보였지만 항상 자신이 원하는 방식으로 행동하는 것은 아니기 때문에 이것을 거부했습니다. 특히, CGImageCreateWithMaskingColors()의 출력은 동일한 함수에 대한 다른 호출의 입력으로 사용될 수 없습니다. 이유를 찾지 못했지만 알파 채널과 관련이 있다고 생각합니다. 어떤 경우
, 내 솔루션입니다 :
- (UIImage*) replaceColor:(UIColor*)color inImage:(UIImage*)image withTolerance:(float)tolerance {
CGImageRef imageRef = [image CGImage];
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
NSUInteger bitmapByteCount = bytesPerRow * height;
unsigned char *rawData = (unsigned char*) calloc(bitmapByteCount, sizeof(unsigned char));
CGContextRef context = CGBitmapContextCreate(rawData, width, height,
bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
CGColorRef cgColor = [color CGColor];
const CGFloat *components = CGColorGetComponents(cgColor);
float r = components[0];
float g = components[1];
float b = components[2];
//float a = components[3]; // not needed
r = r * 255.0;
g = g * 255.0;
b = b * 255.0;
const float redRange[2] = {
MAX(r - (tolerance/2.0), 0.0),
MIN(r + (tolerance/2.0), 255.0)
};
const float greenRange[2] = {
MAX(g - (tolerance/2.0), 0.0),
MIN(g + (tolerance/2.0), 255.0)
};
const float blueRange[2] = {
MAX(b - (tolerance/2.0), 0.0),
MIN(b + (tolerance/2.0), 255.0)
};
int byteIndex = 0;
while (byteIndex < bitmapByteCount) {
unsigned char red = rawData[byteIndex];
unsigned char green = rawData[byteIndex + 1];
unsigned char blue = rawData[byteIndex + 2];
if (((red >= redRange[0]) && (red <= redRange[1])) &&
((green >= greenRange[0]) && (green <= greenRange[1])) &&
((blue >= blueRange[0]) && (blue <= blueRange[1]))) {
// make the pixel transparent
//
rawData[byteIndex] = 0;
rawData[byteIndex + 1] = 0;
rawData[byteIndex + 2] = 0;
rawData[byteIndex + 3] = 0;
}
byteIndex += 4;
}
CGImageRef imgref = CGBitmapContextCreateImage(context);
UIImage *result = [UIImage imageWithCGImage:imgref];
CGImageRelease(imgref);
CGContextRelease(context);
free(rawData);
return result;
}
이 여러 패스와 함께 작동합니다 yubenyi의 코드 팅겨입니다. 이미지를 압축되지 않은 JPEG로 변환하여 처리하기 전에 알파 채널을 제거합니다. 또한 색상 범위 선택 방법에 대한 의견을 추가했습니다.
-(UIImage *)changeWhiteColorTransparent: (UIImage *)image
{
//convert to uncompressed jpg to remove any alpha channels
//this is a necessary first step when processing images that already have transparency
image = [UIImage imageWithData:UIImageJPEGRepresentation(image, 1.0)];
CGImageRef rawImageRef=image.CGImage;
//RGB color range to mask (make transparent) R-Low, R-High, G-Low, G-High, B-Low, B-High
const double colorMasking[6] = {222, 255, 222, 255, 222, 255};
UIGraphicsBeginImageContext(image.size);
CGImageRef maskedImageRef=CGImageCreateWithMaskingColors(rawImageRef, colorMasking);
//iPhone translation
CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 0.0, image.size.height);
CGContextScaleCTM(UIGraphicsGetCurrentContext(), 1.0, -1.0);
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, image.size.width, image.size.height), maskedImageRef);
UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
CGImageRelease(maskedImageRef);
UIGraphicsEndImageContext();
return result;
}
는 @PKCLsoft의 훌륭한 답변에 따라, 나는 단지 화이트 색상 투명하게 편집했다,하지만 픽셀이 얼마나 "흰색"을 기반으로 알파합니다. 이것은 흑백 이미지에서 마스크를 만들려고 할 때 유용 할 수 있으므로 텍스트 나 도형에 부드러운 가장자리를줍니다.나는 희망
- (UIImage *)makeWhiteColorTransparentInImage:(UIImage *)image {
CGImageRef imageRef = [image CGImage];
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
NSUInteger bitmapByteCount = bytesPerRow * height;
unsigned char *rawData = (unsigned char*) calloc(bitmapByteCount, sizeof(unsigned char));
CGContextRef context = CGBitmapContextCreate(rawData, width, height,
bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
int byteIndex = 0;
while (byteIndex < bitmapByteCount) {
unsigned char red = rawData[byteIndex];
unsigned char green = rawData[byteIndex + 1];
unsigned char blue = rawData[byteIndex + 2];
unsigned char alpha = rawData[byteIndex + 3];
if (alpha == 0.0) {
rawData[byteIndex + 3] = 0.0;
} else {
rawData[byteIndex + 3] = 255.0 - (red + green + blue)/3.0;
}
byteIndex += 4;
}
CGImageRef imgref = CGBitmapContextCreateImage(context);
UIImage *result = [UIImage imageWithCGImage:imgref];
CGImageRelease(imgref);
CGContextRelease(context);
free(rawData);
return result;
}
은 도움이 사람이 어떤 일 :
스위프트 4 : (흰색 마스크에 대한)
extension UIImage {
func imageByMakingWhiteBackgroundTransparent() -> UIImage? {
let image = UIImage(data: UIImageJPEGRepresentation(self, 1.0)!)!
let rawImageRef: CGImage = image.cgImage!
let colorMasking: [CGFloat] = [222, 255, 222, 255, 222, 255]
UIGraphicsBeginImageContext(image.size);
let maskedImageRef = rawImageRef.copy(maskingColorComponents: colorMasking)
UIGraphicsGetCurrentContext()?.translateBy(x: 0.0,y: image.size.height)
UIGraphicsGetCurrentContext()?.scaleBy(x: 1.0, y: -1.0)
UIGraphicsGetCurrentContext()?.draw(maskedImageRef!, in: CGRect.init(x: 0, y: 0, width: image.size.width, height: image.size.height))
let result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return result
}
}
- 1. TDCalendarView의 배경색을 투명하게 만드는 방법은 무엇입니까?
- 2. MDIChild를 투명하게 만드는 방법은 무엇입니까?
- 3. MdiClient 배경을 투명하게 만드는 방법은 무엇입니까?
- 4. MultiHandleSliderExtender를 투명하게 만드는 방법은 무엇입니까?
- 5. iPhone보기를 투명하게 만드는 방법은 무엇입니까?
- 6. DataGrid를 투명하게 만드는 방법은 무엇입니까?
- 7. OpenGL에서 텍스처를 투명하게 만드는 방법은 무엇입니까?
- 8. 핑크 배경의 아이콘을 투명하게 만드는 방법은 무엇입니까?
- 9. 회사의 프록시를 투명하게 만드는 방법은 무엇입니까?
- 10. NSScroller의 노브 트랙을 투명하게 만드는 방법은 무엇입니까?
- 11. iOS : UIWebView를 50 % 투명하게 만드는 방법은 무엇입니까?
- 12. BlackBerry에서 이미지를 투명하게 만드는 방법은 무엇입니까?
- 13. JCheckBox의 배경을 투명하게 만드는 방법은 무엇입니까?
- 14. Android에서 캔버스를 투명하게 만드는 방법은 무엇입니까?
- 15. 제출 버튼에서 값을 투명하게 만드는 방법은 무엇입니까?
- 16. C# 이미지의 색상을 투명하게 렌더링합니다.
- 17. matlab에 밝은 색상을 만드는 방법은 무엇입니까?
- 18. 텍스트보기를 투명하게 만드는 방법
- 19. 내 활동을 투명하게 만드는 방법?
- 20. UIImage에서 픽셀 RGB를 NSLog하는 방법은 무엇입니까?
- 21. Flash Builder에서 배경색을 투명하게 만드는 방법
- 22. BufferedImage에서 투명하게 색상을 만들고 PNG로 저장하는 방법
- 23. UITextView에서 텍스트 색상을 투명하게 변경하는 방법
- 24. 투명하게 할 색상을 지정할 수 있습니까
- 25. 탭보기의 탭을 투명하게 만드는 방법
- 26. 자바 JPanel 및 graphics2d를 투명하게 만드는 방법은 무엇입니까?
- 27. 콘솔 명령으로 kde (3) 패널을 투명하게 만드는 방법은 무엇입니까?
- 28. 사용자 정의 대화 상자를 투명하게 만드는 방법은 무엇입니까?
- 29. Internet Explorer에서 GWT RichTextArea를 투명하게 만드는 방법은 무엇입니까?
- 30. jQuery 모달 오버레이를 100 % 투명하게 만드는 방법은 무엇입니까?
코드 내가 어떤 green.or 빨간색으로 변경 어떻게 훌륭하네요 작동 다른 색상 –
좋은 기능을 이용해 주셔서 감사합니다. 그러나 나는이 변경을하지 않을 때까지 참된 결과를 얻을 수 없었다 : kCGImageAlphaPremultipliedFirst -> kCGImageAlphaPremultipliedLast 그 함수가 나에게 진정한 결과를 주었다. :) 고맙습니다. – Vitaly
녹색을 검정색으로 변경하려면 어떻게해야합니까? – isarathg