UIImage drehen und Overlay hinzufügen

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

  • UIImage drehen und Overlay hinzufügen

    Hey Leute!

    Ich versuche gerade, in ein Bild ein anderes hinein zu speichern.
    Das eine Bild kommt aus einem QRCode Generator. Da ich schon Text hinzufüge, habe ich CGContextRef und so weiter parat.
    Ich bekomme auch das Bild angefügt, allerdings nicht so, wie es sein soll.

    Da sich das Seitenverhältnis des Bildes durchaus ändern kann, habe ich eine UIImageView genommen, um das Bild an der richtigen Stelle zu platzieren.
    Um das Verhältnis beizubehalten verwende ich folgenden Code:

    Quellcode

    1. CGFloat imageFullSize = [[NSNumber numberWithInteger:[[NSUserDefaults standardUserDefaults] integerForKey:@"QRSize"]] floatValue];
    2. CGFloat imagePartSize90 = (imageFullSize / 100) * 90;
    3. CGFloat imagePartSize10 = (imageFullSize / 100) * 10;
    4. CGFloat imagePartSize05 = (imageFullSize / 100) * 05;
    5. UIGraphicsBeginImageContext(CGSizeMake(imageFullSize, imageFullSize));
    6. [[UIImage imageNamed:@"qrCodeImage.png"] drawAtPoint:CGPointMake(imagePartSize10, 0)];
    7. /////////////////////////////////////
    8. // HIER BEGINNT DER RELEVANTE CODE //
    9. /////////////////////////////////////
    10. UIImageView *projView = [[UIImageView alloc] init];
    11. [projView setFrame:CGRectMake(imagePartSize05, (imageFullSize / 2) - (imagePartSize90 / 2), imagePartSize90, imagePartSize10)];
    12. [projView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
    13. [projView setContentMode:UIViewContentModeScaleAspectFit];
    14. [projView setImage:projImage];
    Alles anzeigen


    An dieser Stelle wollte ich die UIImageView drehen, allerdings verändert sich GAR nichts, das Bild bleibt ungedreht:

    Quellcode

    1. [projView setTransform:CGAffineTransformMakeRotation(M_PI * 90 / 180)];


    Wenn ich jetzt das versuche, Bild mit dem gleichen Frame, den es schon hat, in den UIGraphicsGetImageFromCurrentImageContext zuschreiben, verzerrt sich das Bild total und ist nicht mehr zu gebrauchen:

    Quellcode

    1. [projView drawRect:CGRectMake(imagePartSize05, (imageFullSize / 2) - (imagePartSize90 / 2), imagePartSize90, imagePartSize10)];
    2. docData = UIImageJPEGRepresentation(UIGraphicsGetImageFromCurrentImageContext(), [[NSUserDefaults standardUserDefaults] integerForKey:@"QRQuality"]);
    3. UIGraphicsEndImageContext();



    Kann mir vielleicht jemand von euch an dieser Stelle ein wenig zur Hand gehen?
    Was hab ich vergessen bzw. wo liegt mein Denkfehler?

    Vielen Dank und herzliche Grüße
    Julian
  • Wie ja in meiner Frage recht ausführlich beschrieben, verwende ich bereits einen Grafikkontext.

    CGContextTotateCTM habe ich bereits probiert. Allerdings ist dabei nur Murks raus gekommen…
    Kannst Du mir sagen, wie sich das Koordinatensystem dann Verhält?
    Also dreht sich auch der Inhalt des bisherigen Kontexts?
    Muss ich dann umdenken und neue Grafiken im "gedrehten" System einfügen?

    Hast Du evtl. auch eine Idee zum Thema Seitenverhältnis bzw. wieso meine UIImageView nicht so arbeitet, wie ich will?
  • Wenn ich das in Deinem Code richtig verstehe, verwendest Du einen Imageview zum drehen. Ich sehe auch nicht, wo Du das Bild in den Kontext zeichnest.

    julian.weinert schrieb:

    Kannst Du mir sagen, wie sich das Koordinatensystem dann Verhält?
    Also dreht sich auch der Inhalt des bisherigen Kontexts?
    Muss ich dann umdenken und neue Grafiken im "gedrehten" System einfügen?

    Du drehst das Koordinatensystem nur für die folgenden Operationen. Probieren geht über studieren ;)
    „Meine Komplikation hatte eine Komplikation.“
  • Nein. Die imageView verwende ich, wie in meiner Frage ausführlich beschrieben, um Das Seitenverhältnis des Bildes zu behalten, je nacht dem, welche Seite der imageView kleiner oder größer wird.
    Aus meinem ersten Code-Block:

    Quellcode

    1. [projView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
    2. [projView setContentMode:UIViewContentModeScaleAspectFit];


    Das Bild zeichne ich in den Kontext in Zeile 1 meines letzten Code-Blocks:

    Quellcode

    1. [projView drawRect:CGRectMake(imagePartSize05, (imageFullSize / 2) - (imagePartSize90 / 2), imagePartSize90, imagePartSize10)];



    Na gut… Dann probiere ich mal…
    Das letzte Mal hats nicht geklappt
  • So. In den Kontext schreiben mache ich jetzt mit [[projView layer] renderInContext:UIGraphicsGetCurrentContext()];
    Funktioniert auch prima, das Bildverhältnis bleibt jetzt auch richtig.
    Danke dafür.

    Jetzt bleibt nur noch das Problem mit dem drehen.
    Wenn ich das hier verwende:

    Quellcode

    1. CGContextRotateCTM(UIGraphicsGetCurrentContext(), 270 * M_PI / 2);
    2. [[projView layer] renderInContext:UIGraphicsGetCurrentContext()];

    verschwindet das Bild leider komplett… Irgendwie check ich das nicht ganz, glaube ich ;)
  • julian.weinert schrieb:

    Jetzt bleibt nur noch das Problem mit dem drehen.
    Wenn ich das hier verwende:

    Quellcode

    1. CGContextRotateCTM(UIGraphicsGetCurrentContext(), 270 * M_PI / 2);
    2. [[projView layer] renderInContext:UIGraphicsGetCurrentContext()];

    verschwindet das Bild leider komplett… Irgendwie check ich das nicht ganz, glaube ich ;)

    Vermutlich, weil der Drehpunkt nicht das Zentrum des Bildes ist. Das Bild dreht sich daher aus dem sichtbaren Bereich heraus.

    Michael
  • macmoonshine schrieb:

    Du drehst das Koordinatensystem nur für die folgenden Operationen. Probieren geht über studieren


    Das stimmt leider (scheinbar) nicht.
    Wenn ich ein Mal diese Methode anwende, ist direkt der gesamte Kontext futsch.
    Das Bild erscheint ebenfalls nicht und der Rahmen, den ich zuvor um die gesamte Grafik gezeichnet hab, verschwindet zur Hälfte.

    So. Inklusive Deines Einwandes mit der UIImageView (habe ja schon reichlich erklärt, dass ich diese zum beibehalten des Bildverhältnisses brauche) habe ich diesen Code:

    Quellcode

    1. CGAffineTransform transform1 = CGAffineTransformMakeRotation(-90.0 * M_PI / 180.0);
    2. CGContextConcatCTM(UIGraphicsGetCurrentContext(), transform1);
    3. UIImage *projImage = [UIImage imageNamed:@"projekt.png"];
    4. [projImage drawInRect:CGRectMake(imagePartSize05, (imageFullSize / 2) - (imagePartSize90 / 2), imagePartSize90, imagePartSize90)];


    Also in der Frage sind ja alle Rahmenbedingungen ausführlich erklärt.
    Falls jemand dazu noch einen schlauen funktionierenden Einfall hat gerne…
    Aber bisher hat leider nichts funktioniert, wahrscheinlich wird das nichts.


    Dank für eure Bemühungen
    Grüße