2011-07-28 6 views
7

OpenGL ES 2.0 텍스처로 사용할 텍스트에서 RGBA8 이미지를 생성하려고합니다.어떻게 Core Graphics에서 RGBA 이미지를 생성합니까?

+(UIImage *)imageFromText:(NSString *)text 
{ 
    UIFont *font = [UIFont systemFontOfSize:20.0]; 
    CGSize size = [text sizeWithFont:font]; 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef contextRef = CGBitmapContextCreate (NULL, 
                size.width, size.height, 
                8, 4*size.width, 
                colorSpace, 
                kCGImageAlphaLast 
                ); 
    CGColorSpaceRelease(colorSpace); 
    UIGraphicsPushContext(contextRef); 

    [text drawAtPoint:CGPointMake(0.0, 0.0) withFont:font]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsPopContext(); 

    return image; 
} 

불행히도 CGColorSpaceCreateDeviceRGBA 없다, 다음과 같은 오류 CGColorSpaceCreateDeviceRGB 결과 :

CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 448 bytes/row. 

내가 OpenGL을 여기에 원하는 적절한 RGBA8 형식을 만드는 실종 무엇?

업데이트 : 내가 오류가 시도한 몇 가지 변화 중 하나입니다 kCGImageAlphaLast에 (그것이 내가 코드를 붙여 복사 할 때이었다) kCGImageAlphaNone에서 CGBitmapContextCreate의 마지막 매개 변수를 변경했습니다.

업데이트 2 : 컨텍스트가 UIGraphicsBeginImageContext()로 생성되지 않은 경우 UIGraphicsGetImageFromCurrentImageContext()은 nil을 반환, 그래서 다른 이미지를 추출 할 필요가있다 : [UIImage imageWithCGImage:CGBitmapContextCreateImage(contextRef)].

답변

14

생성시 지정한 색상 공간으로 인해 오류가 발생하지 않습니다.

당신이 오류가 발생하고있는 이유는 구성 요소 당 8 비트, 당신은 bytesPerRow 위해 전달 된 4*size.width 값, 아직 kCGImageAlphaNonebitmapInfo 매개 변수 아마도 4 색 구성 요소를 지정한 것입니다. kCGImageAlphaNone은 이 아니라 RGB을 의미합니다. RGBA을 원하면 kCGImageAlphaLastkCGImageAlphaPremultipliedLast을 지정해야합니다.

[편집] 죄송합니다. 나는 kCGImageAlphaPremultipliedLast이라고 말했고, kCGImageAlphaLast이 아닐 것입니다.

그래서,이 같은 :

CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 
CGContextRef contextRef = CGBitmapContextCreate(NULL, 
               size.width, 
               size.height, 
               8, 
               4 * size.width, 
               colorSpace, 
               kCGImageAlphaPremultipliedLast); 
+1

이 답변에 자리이며, 90 계산한다. :) –

+1

나는 그것을 또한 시험해 보았다. "CGBitmapContextCreate : 지원되지 않는 매개 변수 조합 : 8 정수 비트/구성 요소, 32 비트/픽셀, 3 구성 요소 색상 공간, kCGImageAlphaLast, 448 바이트/행"같은 오류 메시지가 나타납니다. –

+0

kCGImageAlphaLast에서 오류가 계속 발생했음을 보여주기 위해 질문을 업데이트했습니다. –

1

내가 kCGImageAlphaPremultipliedLast를 사용에도 불구하고 같은 unsupported parameter combination 오류가 발생했습니다. 제 경우의 문제는 제가 얻었던 너비가 부분적인 것이 었습니다. int(width)을 CGBitmapContextCreate에 전달하여 정수로 변환하면 문제가 해결됩니다. 두 번째 인수로 소수 폭 먹이와 스티븐의 comment--

문제에 응답

--edit는 CGBitmapContextCreate이로 해석되지 않습니다 같은 - 명시된 바와 같이, 그것은 인수의에 암시 적 캐스트됩니다 부호없는 정수 유형. 오히려 int (너비 * 4)가 int (너비) * 4와 같지 않으므로 bytes_per_row 인수에 불일치가 발생합니다. 폭이 22.5 인 경우, 다음 폭은 22로 절단됩니다 만, width * 4하지 88

+1

불가능합니다. 'CGBitmapContextCreate'의 width 인수는 이미 (부호없는) 정수입니다. 당신을 위해 캐스팅이 완료되었습니다. –

+0

이 메모는 관찰을보고 했으므로 정의에 의해 불가능한 것이 아니기 때문에 발생했습니다. 그런데, 나의 분석은 불완전했다. 내 답변을 편집하고 분수 너비를 사용하는 것이 왜 문제인지 명확히했습니다. – er0

+1

사실, 관측/측정에 의문을 제기하고있었습니다. 명확히 해 주셔서 감사합니다. 그런데 OP와 같은 데이터 인수에 NULL을 사용하는 경우 행 당 바이트 수를 0으로 전달하여 시스템에서 올바른 (그리고 더 뛰어난 성능을 가진) 값을 선택할 수 있도록합니다. –

0
CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 

    CGBitmapInfo bitmapInfo = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little; 

    CGContextRef theContext = CGBitmapContextCreate(NULL, imgSize.width, imgSize.height, 8, 4*imgSize.width, colorSpace, bitmapInfo); 
관련 문제