NSImage : mich selber um 90 Grad drehen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSImage : mich selber um 90 Grad drehen

    Nabend,

    ich Rätsel gerade herum wie ich mich selber ( NSImage ) um 90 Grad drehe. Wie ich ein Bild um einen beliebige Grad zahl drehe weiß ich. Bei der Sache zeichne ich das Original Bild auf ein temporäres, gebe das Originalbild frei und erstelle das Originalbild wieder aus dem temporären Bild.

    Aber wie mache ich das mit self? Mich selber freigeben und neu initialisieren geht nun ja nicht.
    Oder doch?

    Sven
    :wq! /dev/null
  • RE: NSImage : mich selber um 90 Grad drehen

    Erstelle doch eine Methode als Category zu NSImage die z.B. so aussehen könnte:

    Quellcode

    1. - (NSImage *)rotate:(float)degree
    2. {
    3. NSImage *rotatedImage = ... // ein um degress gedrehtes Image von self erstellen;
    4. return [rotatedImage autorelease];
    5. }
    Um die Freigabe des "original" Images muss sich ja der Aufrufer kümmern, da sich dieser ja auch um die Erstellung/Initialisierung des "original" Images gekümmert hat.

    Oder meintest Du etwas ganz anderes mit Deiner Frage?
  • RE: NSImage : mich selber um 90 Grad drehen

    Wenn er die Basisklasse hätte, würde sein self nicht auf ein Image zeigen. Das hoffe ich jedenfalls. ;)

    Argh, Schwachsinn du hast ja Recht. Könnte auch eine Kategorie sein.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: NSImage : mich selber um 90 Grad drehen

    @Tom
    Das ist eine CustomClass von NSImage in einem Framework. Ich sage nur initWithImage: oder initWithContensOfFile: Die CustomClass schaut nun wie die ImageOrientation ist und soll das Bild eventuell drehen wenn es nicht korrekt herum steht. Dafür muss ich mich nun selber drehen.
    Von aussen hat darauf gar keiner Zugriff und soll auch nicht steuerbar sein. Die Klasse soll sich darum selber kümmern.
    Alternativ wäre noch die Möglichkeit, das nachdem ich das gedrehte Bild auf das temporäre Bild gezeichnet habe. Ich das temporäre Bild 1zu1 zurück auf mich selber zeichne. Irgendwie finde ich das aber unsinnig und Performance Verschwendung.

    @MCDan
    Ja es ist eine CustomClass von NSImage

    Sven
    :wq! /dev/null
  • RE: NSImage : mich selber um 90 Grad drehen

    Wenn du das gleich im -init… machst, dann mache es so, wie McDan gesagt hat: Mit einem neuen Image-Objekt.

    Denke daran, dass -init… neue Objekte zurückgeben dürfen. Genau solche Aufgaben sind der Grund dafür!

    Cocoa macht es übrigens auch so. Es kann also nicht völiig falsch sein. ;)
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: NSImage : mich selber um 90 Grad drehen

    Ok in diesem Fall geht das wirklich.

    Aber wenn ich nun das von aussen doch zugreifbar mache, dann würde ich wieder vor dem gleichen Problem stehen.

    Quellcode

    1. SJImage *img = [[SJImage alloc] initWithContentsofFile:@"irgendeinPfad"];
    2. [img rotateImageWithAngle:90];
    3. [img writeToFile:@"andererPfad"];
    4. [img release];

    Man könnte bei rotateImageWithAngle: nun ein NSImage zurück geben welches ich dann schreibe. Allerdings wenn danach noch 874375 Schritte mit img gemacht werden sollen wäre das wieder unsinnig.

    In meinem Fall würd es dann eben nur lauten:

    Quellcode

    1. if([self imageOrientation] ==6) [self rotateImageWithAngle:90];

    ich wollte nur dem ganzen aus dem Weg gehen, das ich mir das Bild hier kreuz und quer durch die Objekte schiebe. Geht wohl nicht anders *hmm*

    Sven
    :wq! /dev/null
  • RE: NSImage : mich selber um 90 Grad drehen

    Ah, es geht sicherlich auch zur Laufzeit, wenn du das brauchst. So ein Weg, der mir einfälllt:

    Du machst ein zweites Image, weil es einfacher ist. Dann löschst du alle Image-Reps bei dir, änderst die Größe und fügst die aus dem zweiten Image hinzu. So oder so ähnlich.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: NSImage : mich selber um 90 Grad drehen

    Ah, noch eine ganz andere Idee, vllt passt sie bei dir nicht.

    Mach dir ein kleines Objekt, welches das Original hält. Dann verweist du nicht mehr auf das Image selbst, sondern auf dieses Objekt. Hierin kannst du es dann austauschen. Vor allem. Du kannst das Original behalten und je nachdem, wenn es bereits eine bearbeitete Version gibt, diese ausliefern. So wird das Original nicht verändert:

    Quellcode

    1. - (NSImage*)currentVersion {
    2. if( _currentVersion ) {
    3. return _currentVersion;
    4. } else {
    5. return _originalVersion;
    6. }
    7. }
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: NSImage : mich selber um 90 Grad drehen

    Original von Tom9811
    Du machst ein zweites Image, weil es einfacher ist. Dann löschst du alle Image-Reps bei dir, änderst die Größe und fügst die aus dem zweiten Image hinzu. So oder so ähnlich.

    Die Idee ist theoretisch gut.
    Praktisch bekomme ich ein NSCachedImageRep heraus. Und ich hab noch nicht wirklich raus wie ich die Dinger vernünftig bearbeite. Ich bekomme danach zumindestens den Debugger zu sehen.
    Füge ich ein NSLog(@"%@",[self representations]); hinzu, dann funktioniert die Routine.

    bzw. das auf sich selber zeichnen endet im gleichen "Debugger gucken" :-/

    Sven
    :wq! /dev/null
  • RE: NSImage : mich selber um 90 Grad drehen

    Original von Tom9811
    Wenn du das gleich im -init… machst, dann mache es so, wie McDan gesagt hat: Mit einem neuen Image-Objekt.

    Denke daran, dass -init… neue Objekte zurückgeben dürfen. Genau solche Aufgaben sind der Grund dafür!

    Cocoa macht es übrigens auch so. Es kann also nicht völiig falsch sein. ;)


    so hab ich nun gemacht und so funktioniert es auch.

    Danke euch
    :wq! /dev/null
  • RE: NSImage : mich selber um 90 Grad drehen

    Eieieieieiei, da scheint mal wieder wer bei Cocoa faul zu sein. Ich hatte da auch schon meine liebe Müh' und Not mit Bezier-Pfaden. Mutmaßlich wird nicht alles angelegt und gemerkt, was angelegt ist. Stiehlt man dann Einzelteile, passt das nicht mehr zusammen.

    Wenn es wirklich drauf ankommt, das später machen zu können, sollte man viellleicht mal in GNUStep schauen, was da intern geschieht. Der Aufwand würde aber mutmaßlich so hoch, dass man lieber den Rest des Programmes ändert.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?