Tôi có một UIImage
cái là UIImageOrientationUp
(chân dung) mà tôi muốn xoay ngược chiều kim đồng hồ 90 độ (theo chiều ngang). Tôi không muốn sử dụng a CGAffineTransform
. Tôi muốn các pixel của UIImage
vị trí thực sự thay đổi. Tôi đang sử dụng một khối mã (hiển thị bên dưới) ban đầu dự định thay đổi kích thước UIImage
để làm điều này. Tôi đặt kích thước mục tiêu là kích thước hiện tại của UIImage
nhưng tôi gặp lỗi:
(Lỗi): CGBitmapContextCreate: byte / hàng dữ liệu không hợp lệ: tối thiểu phải là 1708 cho 8 bit / thành phần, 3 thành phần, kCGImageAlphaPremultipliedLast.
(Tôi không gặp lỗi bất cứ khi nào tôi cung cấp kích thước NHỎ làm kích thước mục tiêu BTW). Làm cách nào tôi có thể QUAY LẠI UIImage
90 độ CCW của mình bằng cách chỉ sử dụng các chức năng đồ họa cốt lõi trong khi duy trì kích thước hiện tại?
-(UIImage*)reverseImageByScalingToSize:(CGSize)targetSize:(UIImage*)anImage
{
UIImage* sourceImage = anImage;
CGFloat targetWidth = targetSize.height;
CGFloat targetHeight = targetSize.width;
CGImageRef imageRef = [sourceImage CGImage];
CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);
CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef);
if (bitmapInfo == kCGImageAlphaNone) {
bitmapInfo = kCGImageAlphaNoneSkipLast;
}
CGContextRef bitmap;
if (sourceImage.imageOrientation == UIImageOrientationUp || sourceImage.imageOrientation == UIImageOrientationDown) {
bitmap = CGBitmapContextCreate(NULL, targetHeight, targetWidth, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);
} else {
bitmap = CGBitmapContextCreate(NULL, targetWidth, targetHeight, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);
}
if (sourceImage.imageOrientation == UIImageOrientationRight) {
CGContextRotateCTM (bitmap, radians(90));
CGContextTranslateCTM (bitmap, 0, -targetHeight);
} else if (sourceImage.imageOrientation == UIImageOrientationLeft) {
CGContextRotateCTM (bitmap, radians(-90));
CGContextTranslateCTM (bitmap, -targetWidth, 0);
} else if (sourceImage.imageOrientation == UIImageOrientationDown) {
// NOTHING
} else if (sourceImage.imageOrientation == UIImageOrientationUp) {
CGContextRotateCTM (bitmap, radians(90));
CGContextTranslateCTM (bitmap, 0, -targetHeight);
}
CGContextDrawImage(bitmap, CGRectMake(0, 0, targetWidth, targetHeight), imageRef);
CGImageRef ref = CGBitmapContextCreateImage(bitmap);
UIImage* newImage = [UIImage imageWithCGImage:ref];
CGContextRelease(bitmap);
CGImageRelease(ref);
return newImage;
}