Mam UIImage
taki UIImageOrientationUp
(portret), który chciałbym obrócić w lewo o 90 stopni (do poziomu). Nie chcę używać CGAffineTransform
. Chcę, aby piksele UIImage
faktycznie zmieniły pozycję. Używam bloku kodu (pokazanego poniżej) pierwotnie przeznaczonego do zmiany rozmiaru, UIImage
aby to zrobić. Ustawiam rozmiar docelowy jako aktualny rozmiar, UIImage
ale pojawia się błąd:
(Błąd): CGBitmapContextCreate: nieprawidłowe bajty danych / wiersz: powinno wynosić co najmniej 1708 dla 8 bitów całkowitych / komponent, 3 składniki, kCGImageAlphaPremultipliedLast.
(Nie otrzymuję błędu za każdym razem, gdy podam MNIEJSZY rozmiar jako rozmiar docelowy BTW). Jak mogę OBRÓCIĆ mój UIImage
90 stopni w lewo, używając tylko podstawowych funkcji graficznych, zachowując aktualny rozmiar?
-(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;
}