Nachdem ich einen 3D-Transform auf eine UIImageView-Schicht angewendet habe, muss ich die resultierende "Ansicht" als neues UIImage speichern... Das schien zuerst eine einfache Aufgabe zu sein :-) aber bisher kein Glück, und die Suche hat keine Hinweise ergeben :-( also hoffe ich, dass mir jemand freundlicherweise den richtigen Weg weisen wird.
Ein sehr einfaches iPhone-Projekt ist hier verfügbar.
Danke.
- (void)transformImage {
float grad = 12.0;
float zAbstand = 250;
CATransform3D transform3D = CATransform3DIdentity;
transform3D.m34 = 1.0 / zAbstand; // die Zelle m34 der Matrix steuert die Perspektive, und zAbstand beeinflusst die "Schärfe" des Transformations
transform3D = CATransform3DRotate(transform3D, DEGREES_TO_RADIANS(grad), 1, 0, 0); // Perspektiventransformation auf der y-Achse
imageView.layer.transform = transform3D;
}
/* FEHLER: Das Erfassen des Schichteninhalts ergibt nicht das transformierte Bild -- nur das Original
CGImageRef newImageRef = (CGImageRef)imageView.layer.contents;
UIImage *bild = [UIImage imageWithCGImage:newImageRef];
*/
/* FEHLER: Die Dokumentation für renderInContext besagt, dass sie keine 3D-Transformationen rendert
UIGraphicsBeginImageContext(imageView.image.size);
[imageView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *bild = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
*/
//
// Überschrift
//
#import
#define DEGREES_TO_RADIANS(x) x * M_PI / 180
UIImageView *imageView;
@property (nonatomic, retain) IBOutlet UIImageView *imageView;
//
// Code
//
@synthesize imageView;
- (void)transformImage {
float grad = 12.0;
float zAbstand = 250;
CATransform3D transform3D = CATransform3DIdentity;
transform3D.m34 = 1.0 / zAbstand; // die Zelle m34 der Matrix steuert die Perspektive, und zAbstand beeinflusst die "Schärfe" des Transformations
transform3D = CATransform3DRotate(transform3D, DEGREES_TO_RADIANS(grad), 1, 0, 0); // Perspektiventransformation auf der y-Achse
imageView.layer.transform = transform3D;
}
- (UIImage *)captureView:(UIImageView *)ansicht {
UIGraphicsBeginImageContext(ansicht.frame.size);
[ansicht.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *neuesBild = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return neuesBild;
}
- (void)imageSavedToPhotosAlbum:(UIImage *)bild didFinishSavingWithError:(NSError *)fehler contextInfo:(void *)kontextInfo {
NSString *titel = @"In Fotoalbum speichern";
NSString *nachricht = (fehler ? [fehler description] : @"Erfolg!");
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:titel message:nachricht delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
[alert release];
}
- (IBAction)saveButtonClicked:(id)sender {
UIImage *neuesBild = [self captureView:imageView];
UIImageWriteToSavedPhotosAlbum(neuesBild, self, @selector(imageSavedToPhotosAlbum: didFinishSavingWithError: contextInfo:), nil);
}
0 Stimmen
Hast du versucht, die Ansicht zu greifen, die deine transformierte Ansicht enthält?
0 Stimmen
Nicht ganz sicher, was du meinst... Ich habe [view image] ausprobiert (wobei view mein UIImageView ist), aber das zurückgegebene Bild ist nicht das transformierte Bild.
1 Stimmen
Finde eine Antwort darauf?
1 Stimmen
Hast du eine Antwort auf diese Frage bekommen? Bitte hilf mir. Ich habe das gleiche Problem, nachdem ich 3D-Transformation geändert und das Bild gespeichert habe. Ist das möglich?
0 Stimmen
Das liegt daran, dass der Inhalt der Ebene nicht transformiert wird, und
[imageView.layer renderInContext:...]
im Koordinatensystem vonimageView
rendert. Die Transformations wird zwischen der Ansicht und ihrer übergeordneten Ansicht angewendet, daher müssten Sie dies in eine Containeransicht einfügen und den Container rendern (aber wenn die Dokumentation besagt, dass sie keine 3D-Transformationen unterstützt, wird es wahrscheinlich sowieso nicht funktionieren, obwohl ich erwarten würde, dass irgendeine Art von Transformation angewendet wird).0 Stimmen
Laden Sie das UIImage in ein UIWebView (über HTML-Injektion) und transformieren Sie das Bild dann dort (über CSS3- oder Javascript-Injektion) und verwenden Sie dann
renderInContext
auf Ihrem UIWebView.0 Stimmen
(*Übrigens können Sie den Hintergrund einer UIWebView mit CSS transparent setzen (und auch die Hintergrund-Einstellungen in Objective-C umschalten), damit Ihr 3D-transformiertes Bild nicht von einem undurchsichtigen, leeren weißen Quadrat umgeben ist)