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;
}
źródło
Odpowiedzi:
A co z czymś takim:
źródło
Uważam, że najłatwiejszym sposobem (i bezpiecznym wątkiem) jest:
Uwaga: jak powiedział Brainware , modyfikuje to tylko dane orientacji obrazu - dane pikseli pozostają nietknięte. W przypadku niektórych aplikacji może to nie wystarczyć.
Lub w Swift:
źródło
let img = UIImage(cgImage: myImage!.cgImage!, scale: UIScreen.main.scale, orientation: .right)
Sprawdź prosty i niesamowity kod Hardy Macia pod adresem: Cutting-Scaling-and-Rotating-Uiimages
Zadzwoń
Dzięki Hardy Macia!
Nagłówek:
Ponieważ łącze może umrzeć, oto pełny kod
źródło
Choć wydaje się to dziwne, poniższy kod rozwiązał problem za mnie:
źródło
Funkcja bezpiecznego obrotu gwintu jest następująca (działa znacznie lepiej):
źródło
UIImageOrientationDown
.Miałem problem ze wszystkimi powyższymi, łącznie z zatwierdzoną odpowiedzią. Przekonwertowałem kategorię Hardy'ego z powrotem na metodę, ponieważ chciałem tylko obrócić obraz. Oto kod i użycie:
I użycie:
Dzięki Hardy!
źródło
Obróć obraz o 90 stopni (zgodnie z ruchem wskazówek zegara / przeciwnie do ruchu wskazówek zegara)
Wywołanie funkcji -
Realizacja:
źródło
Jeśli chcesz dodać przycisk obracania zdjęcia, który będzie obracał zdjęcie w krokach co 90 stopni, gotowe. (
finalImage
to UIImage, który został już utworzony w innym miejscu).źródło
Prosty. Po prostu zmień flagę orientacji obrazu.
źródło
Oto rozszerzenie Swift do UIImage, które obraca obraz o dowolny kąt. Używaj go tak:
let rotatedImage = image.rotated(byDegrees: degree)
. Użyłem kodu Objective-C w jednej z pozostałych odpowiedzi i usunąłem kilka wierszy, które zostały przez nas niepoprawne (rzeczy z obróconym pudełkiem) i przekształciłem je w rozszerzenie dla UIImage.źródło
Rozszerzenie Swift 3 UIImage:
źródło
Swift 4.2 wersja odpowiedzi RawMean :
źródło
Wypróbowuję ten kod, działa i wziąłem z http://www.catamount.com/blog/1015/uiimage-extensions-for-cutting-scaling-and-rotating-uiimages/
źródło
Niewielka zmiana w stosunku do innych odpowiedzi opartych na kodzie Hardy Macia. Nie ma potrzeby tworzenia całego
UIView
obiektu w celu obliczenia prostokąta ograniczającego obróconego obrazu. Po prostu zastosuj transformację obracania do prostokąta obrazu za pomocąCGRectApplyAffineTransform
.źródło
„tint uiimage grayscale” wydaje się być odpowiednim Google-Fu dla tego
od razu dostaję:
https://discussions.apple.com/message/8104516?messageID=8104516ꩄ
https://discussions.apple.com/thread/2751445?start=0&tstart=0
Jak programowo odcień obrazu na iPhonie?
źródło
Podoba mi się prosta elegancja
Peter Sarnowski
odpowiedzi, ale może ona powodować problemy, gdy nie można polegać naEXIF
metadanych i tym podobnych. W sytuacjach, w których musisz obrócić rzeczywiste dane obrazu , poleciłbym coś takiego:Powyższy kod pobiera obraz, którego orientacja jest
Landscape
(nie pamięta, czy to jestLandscape Left
lubLandscape Right
) i obraca go doPortrait
. To przykład, który możesz zmodyfikować do swoich potrzeb.Kluczowymi argumentami, którymi musiałbyś się bawić, są
CGContextRotateCTM(context, M_PI_2)
miejsca, w których decydujesz, o ile chcesz obracać, ale potem musisz upewnić się, że obraz nadal rysuje się na ekranie za pomocąCGContextTranslateCTM(context, 0, -640)
. Ta ostatnia część jest bardzo ważna, aby upewnić się, że widzisz obraz, a nie pusty ekran.Aby uzyskać więcej informacji, sprawdź źródło .
źródło
resize-a-uiimage-the-right-way wyjaśnia niektóre z problemów występujących w wielu przykładach kodu i zawiera fragmenty kodu, które pomagają radzić sobie z UIImages - prywatna metoda pomocnika w UIImage + resize.m akceptuje przekształcenie, aby umożliwić rotacja, więc wystarczy, że wyeksponujesz to jako publiczny interfejs.
To jest licencja z tego pliku:
źródło
Istnieje niezwykle wydajna kategoria UIImage o nazwie NYXImagesKit. Używa vDSP, CoreImage i vImage, aby działać tak szybko, jak to możliwe. Ma kategorię UIImage + Rotating, która uratowała mi dzień :)
https://github.com/Nyx0uf/NYXImagesKit
źródło
Dla Swift: Oto proste rozszerzenie do UIImage:
( Źródło )
Użyj go z:
Pierwsza z nich obróci obraz i odwróci go, jeśli opcja flip jest ustawiona na true.
źródło