[ios] CGContextDrawImage는 UIImage를 전달할 때 이미지를 거꾸로 그립니다.

CGContextDrawImage내 이미지가 거꾸로 그려 지는지 아는 사람이 있습니까? 내 응용 프로그램에서 이미지를로드하고 있습니다.

UIImage *image = [UIImage imageNamed:@"testImage.png"];

그런 다음 핵심 그래픽을 내 컨텍스트에 그려달라고 간단히 요청하십시오.

CGContextDrawImage(context, CGRectMake(0, 0, 145, 15), image.CGImage);

올바른 위치와 치수로 렌더링되지만 이미지는 거꾸로되어 있습니다. 나는 여기에 정말로 명백한 것을 놓치고 있어야합니까?



답변

대신에

CGContextDrawImage(context, CGRectMake(0, 0, 145, 15), image.CGImage);

사용하다

[image drawInRect:CGRectMake(0, 0, 145, 15)];

시작 / 끝의 중간에 CGcontext 방법 .

이렇게하면 올바른 방향으로 이미지를 현재 이미지 컨텍스트에 그릴 것입니다.이 방법은 UIImage방향에 대한 지식을 유지하는 것과 관련이 있으며 CGContextDrawImage방법은 방향을 이해하지 않고 기본 원시 이미지 데이터를 가져옵니다.


답변

내가 언급 한 모든 것을 적용한 후에도 여전히 이미지와 함께 드라마를 보았습니다. 결국, 나는 Gimp를 사용하여 모든 이미지의 ‘flipped vertical’버전을 만들었습니다. 이제 변환을 사용할 필요가 없습니다. 잘만되면 이것이 더 이상 문제를 일으키지 않을 것입니다.

CGContextDrawImage가 왜 내 이미지를 거꾸로 그리는지 아는 사람이 있습니까? 내 응용 프로그램에서 이미지를로드하고 있습니다.

Quartz2d는 원점이 왼쪽 아래 모서리에있는 다른 좌표계를 사용합니다. 따라서 Quartz가 100 * 100 이미지의 픽셀 x [5], y [10]을 그리면 왼쪽 상단 대신 왼쪽 하단에 픽셀이 그려집니다. 따라서 ‘플립’이미지가 발생합니다.

x 좌표계가 일치하므로 y 좌표를 뒤집어 야합니다.

CGContextTranslateCTM(context, 0, image.size.height);

이것은 x 축에서 이미지를 0 단위로, y 축에서 이미지 높이로 이미지를 변환했음을 의미합니다. 그러나 이것만으로도 이미지가 여전히 거꾸로되어 있다는 것을 의미합니다. 아래에서 “image.size.height”를 그리면됩니다.

Quartz2D 프로그래밍 가이드는 ScaleCTM을 사용하고 음수 값을 전달하여 이미지를 뒤집는 것이 좋습니다. 다음 코드를 사용하여이를 수행 할 수 있습니다.

CGContextScaleCTM(context, 1.0, -1.0);

CGContextDrawImage통화 직전에 두 가지를 결합하면 이미지가 올바르게 그려집니다.

UIImage *image = [UIImage imageNamed:@"testImage.png"];
CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height);

CGContextTranslateCTM(context, 0, image.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

CGContextDrawImage(context, imageRect, image.CGImage);

의도하지 않은 결과를 얻을 수 있으므로 imageRect 좌표가 이미지의 좌표와 일치하지 않으면 조심하십시오.

좌표를 다시 변환하려면

CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0, -imageRect.size.height);


답변

두 세계에서 가장 좋은 것은 UIImage를 사용 drawAtPoint:하거나 drawInRect:여전히 사용자 정의 컨텍스트를 지정하는 동안입니다.

UIGraphicsPushContext(context);
[image drawAtPoint:CGPointZero]; // UIImage will handle all especial cases!
UIGraphicsPopContext();

또한 당신은 당신의 문맥을 수정하지 않도록 CGContextTranslateCTM하거나 CGContextScaleCTM하는 두 번째 대답은 않습니다.


답변

관련 Quartz2D 문서 : https://developer.apple.com/library/ios/documentation/2DDrawing/Conceptual/DrawingPrintingiOS/GraphicsDrawingOverview/GraphicsDrawingOverview.html#//apple_ref/doc/uid/TP40010156-CH14-SW4

기본 좌표계 뒤집기

UIKit 도면을 뒤집 으면 LLO 좌표계가있는 도면 환경을 UIKit의 기본 좌표계와 정렬하도록 보조 CALayer를 수정합니다. 그리기에 UIKit 메서드와 함수 만 사용하는 경우 CTM을 뒤집을 필요가 없습니다. 그러나 CoreKit 또는 Image I / O 함수 호출을 UIKit 호출과 혼합하면 CTM 뒤집기가 필요할 수 있습니다.

특히, Core Graphics 함수를 직접 호출하여 이미지 또는 PDF 문서를 그리면 객체가 뷰 컨텍스트에서 거꾸로 렌더링됩니다. 이미지와 페이지를 올바르게 표시하려면 CTM을 뒤집어 야합니다.

UIKit보기에 표시 될 때 올바르게 표시되도록 Core Graphics 컨텍스트에 그려진 객체를 뒤집으려면 CTM을 두 단계로 수정해야합니다. 원점을 도면 영역의 왼쪽 위 모서리로 변환 한 다음 y 좌표를 -1로 수정하여 축척 변환을 적용합니다. 이를 수행하는 코드는 다음과 유사합니다.

CGContextSaveGState(graphicsContext);
CGContextTranslateCTM(graphicsContext, 0.0, imageHeight);
CGContextScaleCTM(graphicsContext, 1.0, -1.0);
CGContextDrawImage(graphicsContext, image, CGRectMake(0, 0, imageWidth, imageHeight));
CGContextRestoreGState(graphicsContext);


답변

컨텍스트에서 사용자 정의 rect로 이미지를 그리기위한 무료 솔루션에 관심이있는 경우 :

 func drawImage(image: UIImage, inRect rect: CGRect, context: CGContext!) {

    //flip coords
    let ty: CGFloat = (rect.origin.y + rect.size.height)
    CGContextTranslateCTM(context, 0, ty)
    CGContextScaleCTM(context, 1.0, -1.0)

    //draw image
    let rect__y_zero = CGRect(origin: CGPoint(x: rect.origin.x, y:0), size: rect.size)
    CGContextDrawImage(context, rect__y_zero, image.CGImage)

    //flip back
    CGContextScaleCTM(context, 1.0, -1.0)
    CGContextTranslateCTM(context, 0, -ty)

}

이미지는 사각형을 채우기 위해 크기가 조정됩니다.


답변

확실하지 UIImage않지만 이러한 종류의 동작은 일반적으로 좌표가 뒤집힐 때 발생합니다. OS X 좌표계의 대부분은 Postscript 및 PDF에서와 같이 왼쪽 하단에 원점이 있습니다. 그러나 CGImage좌표계는 왼쪽 상단에 원점이 있습니다.

가능한 솔루션에는 isFlipped속성 또는 scaleYBy:-1아핀 변환 이 포함될 수 있습니다 .


답변

UIImageCGImage주요 콘텐츠 멤버로 포함하고 배율 및 방향 요소를 포함합니다. CGImage다양한 기능이 OSX에서 파생 되었기 때문에 iPhone에 비해 거꾸로되는 좌표 시스템이 필요합니다. 을 만들면 UIImage기본적으로 거꾸로 된 방향으로 보정됩니다 (이를 변경할 수 있습니다!). 사용 . CGImage속성은 매우 강력한 CGImage기능 에 액세스 하지만 iPhone 화면에 그리는 등의 UIImage방법으로 가장 잘 수행됩니다 .