Ngay cả sau khi áp dụng mọi thứ tôi đã đề cập, tôi vẫn có những bộ phim truyền hình với những hình ảnh. Cuối cùng, tôi vừa sử dụng Gimp để tạo phiên bản 'lật dọc' cho tất cả các hình ảnh của mình. Bây giờ tôi không cần sử dụng bất kỳ Biến đổi nào. Hy vọng rằng điều này sẽ không gây ra vấn đề tiếp theo.
Có ai biết tại sao CGContextDrawImage sẽ vẽ hình ảnh của tôi lộn ngược không? Tôi đang tải một hình ảnh từ ứng dụng của mình:
Quartz2d sử dụng một hệ thống phối hợp khác nhau, trong đó gốc tọa độ ở góc dưới bên trái. Vì vậy, khi Quartz vẽ pixel x [5], y [10] của hình ảnh 100 * 100, pixel đó sẽ được vẽ ở góc dưới bên trái thay vì phía trên bên trái. Do đó gây ra hình ảnh 'lật'.
Hệ thống tọa độ x khớp, vì vậy bạn sẽ cần phải lật tọa độ y.
CGContextTranslateCTM(context, 0, image.size.height);
Điều này có nghĩa là chúng tôi đã dịch hình ảnh bằng 0 đơn vị trên trục x và theo chiều cao hình ảnh trên trục y. Tuy nhiên, điều này một mình sẽ có nghĩa là hình ảnh của chúng tôi vẫn bị lộn ngược, chỉ được vẽ "image.size.height" bên dưới nơi chúng tôi muốn nó được vẽ.
Hướng dẫn lập trình Quartz2D khuyên bạn nên sử dụng ScaleCTM và truyền các giá trị âm để lật ảnh. Bạn có thể sử dụng mã sau đây để làm điều này -
CGContextScaleCTM(context, 1.0, -1.0);
Kết hợp cả hai ngay trước CGContextDrawImage
cuộc gọi của bạn và bạn sẽ có hình ảnh được vẽ chính xác.
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);
Chỉ cần cẩn thận nếu tọa độ imageRect của bạn không khớp với hình ảnh của bạn, vì bạn có thể nhận được kết quả ngoài ý muốn.
Để chuyển đổi lại tọa độ:
CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0, -imageRect.size.height);