Ich habe ein UIImage
Das UIImageOrientationUp
(Porträt), das ich um 90 Grad gegen den Uhrzeigersinn drehen möchte (zur Landschaft). Ich möchte kein verwenden CGAffineTransform
. Ich möchte, dass die Pixel der UIImage
Position tatsächlich verschoben werden. Ich verwende einen Codeblock (siehe unten), der ursprünglich dazu gedacht war, die Größe von a UIImage
zu ändern , um dies zu tun. Ich habe eine Zielgröße als aktuelle Größe festgelegt UIImage
, erhalte jedoch eine Fehlermeldung:
(Fehler): CGBitmapContextCreate: Ungültige Datenbytes / Zeile: sollte mindestens 1708 für 8 Ganzzahlbits / Komponente, 3 Komponenten, kCGImageAlphaPremultipliedLast sein.
(Ich erhalte keine Fehlermeldung, wenn ich eine kleinere Größe als Zielgröße angegeben habe.) Wie kann ich mein UIImage
90-Grad-CCW mit nur den wichtigsten Grafikfunktionen drehen und dabei die aktuelle Größe beibehalten ?
-(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;
}
quelle
Antworten:
Was ist mit so etwas wie:
quelle
Ich glaube, der einfachste Weg (und auch Thread-sicher) ist:
Hinweis: Wie Brainware sagte, werden dadurch nur die Orientierungsdaten des Bildes geändert - die Pixeldaten bleiben unberührt. Für einige Anwendungen reicht dies möglicherweise nicht aus.
Oder in Swift:
quelle
let img = UIImage(cgImage: myImage!.cgImage!, scale: UIScreen.main.scale, orientation: .right)
Schauen Sie sich den einfachen und fantastischen Code von Hardy Macia an: Schneiden, Skalieren und Drehen von Bildern
Ruf einfach an
Vielen Dank, Hardy Macia!
Header:
Da der Link möglicherweise stirbt, finden Sie hier den vollständigen Code
quelle
So seltsam das auch scheint, der folgende Code hat das Problem für mich gelöst:
quelle
Eine thread-sichere Rotationsfunktion ist die folgende (sie funktioniert viel besser):
quelle
UIImageOrientationDown
.Ich hatte Probleme mit allen oben genannten Punkten, einschließlich der genehmigten Antwort. Ich habe Hardys Kategorie wieder in eine Methode umgewandelt, da ich nur ein Bild drehen wollte. Hier ist der Code und die Verwendung:
Und die Verwendung:
Danke Hardy!
quelle
Bild um 90 Grad drehen (im Uhrzeigersinn / gegen den Uhrzeigersinn)
Funktionsaufruf -
Implementierung:
quelle
Wenn Sie eine Schaltfläche zum Drehen von Fotos hinzufügen möchten, mit der das Foto in Schritten von 90 Grad weiter gedreht wird, können Sie loslegen. (
finalImage
ist ein UIImage, das bereits an anderer Stelle erstellt wurde.)quelle
Einfach. Ändern Sie einfach das Bildausrichtungsflag.
quelle
Hier ist eine Swift-Erweiterung für UIImage, die das Bild um einen beliebigen Winkel dreht. Verwenden Sie es so :
let rotatedImage = image.rotated(byDegrees: degree)
. Ich habe den Objective-C-Code in einer der anderen Antworten verwendet und ein paar Zeilen entfernt, die wir falsch geschrieben haben (gedrehtes Kästchen), und daraus eine Erweiterung für UIImage gemacht.quelle
Swift 3 UIImage-Erweiterung:
quelle
Schnelle 4.2-Version von RawMeans Antwort :
quelle
Ich probiere diesen Code aus, er funktioniert und stammt von http://www.catamount.com/blog/1015/uiimage-extensions-for-cutting-scaling-and-rotating-uiimages/
quelle
Kleinere Änderungen an den anderen Antworten, die auf dem Code von Hardy Macia basieren. Es ist nicht erforderlich, ein ganzes
UIView
Objekt zu erstellen, um lediglich das Begrenzungsrechteck des gedrehten Bildes zu berechnen. Wenden Sie einfach eine Drehtransformation mit auf das Bildrechteck anCGRectApplyAffineTransform
.quelle
"tint uiimage greyscale" scheint das passende Google-Fu für dieses zu sein
sofort bekomme ich:
https://discussions.apple.com/message/8104516?messageID=8104516ꩄ
https://discussions.apple.com/thread/2751445?start=0&tstart=0
Wie würde ich ein Bild programmgesteuert auf dem iPhone tönen?
quelle
Ich mag die einfache Eleganz der
Peter Sarnowski
Antwort, aber sie kann Probleme verursachen, wenn Sie sich nicht aufEXIF
Metadaten und dergleichen verlassen können. In Situationen, in denen Sie die tatsächlichen Bilddaten drehen müssen, würde ich Folgendes empfehlen:Der obige Code nimmt ein Bild mit der Ausrichtung
Landscape
(kann mich nicht erinnern, ob esLandscape Left
oder istLandscape Right
) und dreht es inPortrait
. Es ist ein Beispiel, das an Ihre Bedürfnisse angepasst werden kann.Die wichtigsten Argumente, mit
CGContextRotateCTM(context, M_PI_2)
denen Sie spielen müssten, sind, wo Sie entscheiden, um wie viel Sie drehen möchten, aber dann müssen Sie sicherstellen, dass das Bild weiterhin mit auf dem Bildschirm gezeichnet wirdCGContextTranslateCTM(context, 0, -640)
. Dieser letzte Teil ist sehr wichtig, um sicherzustellen, dass Sie das Bild und keinen leeren Bildschirm sehen.Weitere Informationen finden Sie in der Quelle .
quelle
resize-a-uiimage-the-right-way erklärt einige der Probleme, die viele Codebeispiele dafür haben, und enthält einige Codefragmente, die beim Umgang mit UIImages helfen - die private Hilfsmethode in UIImage + resize.m akzeptiert eine Transformation, um dies zuzulassen Rotation, also müssen Sie das nur als öffentliche Schnittstelle verfügbar machen.
Dies ist die Lizenz aus dieser Datei:
quelle
Es gibt eine äußerst effiziente UIImage-Kategorie namens NYXImagesKit. Es verwendet vDSP, CoreImage und vImage, um so schnell wie möglich zu sein. Es hat eine UIImage + Rotating Kategorie, die meinen Tag gerettet hat :)
https://github.com/Nyx0uf/NYXImagesKit
quelle
Für Swift: Hier ist eine einfache Erweiterung von UIImage:
( Quelle )
Verwenden Sie es mit:
Ersteres dreht ein Bild und dreht es um, wenn Flip auf true gesetzt ist.
quelle