Ich habe ein UIImageDas 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 UIImagePosition tatsächlich verschoben werden. Ich verwende einen Codeblock (siehe unten), der ursprünglich dazu gedacht war, die Größe von a UIImagezu ä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 UIImage90-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;
}