Nachdem ich eine 3D-Transformation auf eine UIImageView.layer angewendet habe, muss ich die resultierende "Ansicht" als ein neues UIImage speichern... Schien wie eine einfache Aufgabe auf den ersten :-) aber kein Glück so weit, und die Suche hat keine Hinweise gefunden :-( so ich hoffe, jemand wird so freundlich sein, mich in die richtige Richtung zeigen.
Ein sehr einfaches iPhone-Projekt ist verfügbar aquí .
Gracias.
- (void)transformImage {
float degrees = 12.0;
float zDistance = 250;
CATransform3D transform3D = CATransform3DIdentity;
transform3D.m34 = 1.0 / zDistance; // the m34 cell of the matrix controls perspective, and zDistance affects the "sharpness" of the transform
transform3D = CATransform3DRotate(transform3D, DEGREES_TO_RADIANS(degrees), 1, 0, 0); // perspective transform on y-axis
imageView.layer.transform = transform3D;
}
/* FAIL : capturing layer contents doesn't get the transformed image -- just the original
CGImageRef newImageRef = (CGImageRef)imageView.layer.contents;
UIImage *image = [UIImage imageWithCGImage:newImageRef];
*/
/* FAIL : docs for renderInContext states that it does not render 3D transforms
UIGraphicsBeginImageContext(imageView.image.size);
[imageView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
*/
//
// header
//
#import <QuartzCore/QuartzCore.h>
#define DEGREES_TO_RADIANS(x) x * M_PI / 180
UIImageView *imageView;
@property (nonatomic, retain) IBOutlet UIImageView *imageView;
//
// code
//
@synthesize imageView;
- (void)transformImage {
float degrees = 12.0;
float zDistance = 250;
CATransform3D transform3D = CATransform3DIdentity;
transform3D.m34 = 1.0 / zDistance; // the m34 cell of the matrix controls perspective, and zDistance affects the "sharpness" of the transform
transform3D = CATransform3DRotate(transform3D, DEGREES_TO_RADIANS(degrees), 1, 0, 0); // perspective transform on y-axis
imageView.layer.transform = transform3D;
}
- (UIImage *)captureView:(UIImageView *)view {
UIGraphicsBeginImageContext(view.frame.size);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
- (void)imageSavedToPhotosAlbum:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
NSString *title = @"Save to Photo Album";
NSString *message = (error ? [error description] : @"Success!");
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
[alert release];
}
- (IBAction)saveButtonClicked:(id)sender {
UIImage *newImage = [self captureView:imageView];
UIImageWriteToSavedPhotosAlbum(newImage, self, @selector(imageSavedToPhotosAlbum: didFinishSavingWithError: contextInfo:), nil);
}
0 Stimmen
Haben Sie versucht, die Ansicht, die Ihre transformierte Ansicht enthält, zu greifen?
0 Stimmen
Nicht ganz sicher, was Sie meinen... Ich habe es mit [view image] versucht (wobei view mein UIImageView ist), aber das zurückgegebene Bild ist nicht das transformierte Bild.
1 Stimmen
Haben Sie eine Antwort auf diese Frage gefunden?
1 Stimmen
Haben Sie eine Antwort auf diese Frage erhalten? Bitte helfen Sie mir. Ich habe das gleiche Problem, nachdem ich 3D Transform geändert und das Bild gespeichert habe. Ist es möglich?
0 Stimmen
Das liegt daran, dass der Inhalt der Ebene nicht transformiert wird, und
[imageView.layer renderInContext:...]
rendert im Koordinatensystem vonimageView
. Die Transformation wird zwischen der Ansicht und der übergeordneten Ansicht angewandt, so dass für diese jede Chance, dass es funktioniert, müssten Sie es in eine Container-Ansicht stecken und den Container rendern (aber wenn die Dokumentation sagt, dass es keine 3D-Transformationen verarbeitet, dann wird es wahrscheinlich sowieso nicht funktionieren, obwohl ich erwarten würde einige Art der anzuwendenden Transformation).0 Stimmen
Laden Sie das UIImage in eine UIWebView (per HTML-Injektion) und wandeln Sie das Bild dort um (per CSS3- oder Javascript-Injektion) und nutzen Sie dann
renderInContext
auf Ihrem UIWebView.0 Stimmen
(*Nebenbei bemerkt: Sie können den Hintergrund eines UIWebViews mit CSS (und durch ALSO Umschalten der Hintergrundeinstellungen in objective-c) auf transparent setzen, so dass Ihr 3D-transformiertes Bild nicht von einem undurchsichtigen weißen Quadrat umgeben ist)