Wie ueberlagert man am besten UIImages

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

  • Wie ueberlagert man am besten UIImages

    Hallo zusammen,
    ich bin gerade dabei mit UIImages herumzuexperimentieren. Ganz konkret habe ich ein Hintergrundbild als png und 3 Layer, die aus dem Hintergrund ausgeschnitten sind und teilweise transparent gemacht wurden.
    Nun die Frage, wie kann ich diese 3 Layer wieder mit dem Hintergrund "zusammenmergen" und in einer UIImageView anzeigen?
    Ist sinnvoll eine UIView subclass zu erstellen und die DrawRect Methode zu ueberschreiben.
    Ich dachte da an sowas:

    Quellcode

    1. CALayer *imgLayer1 = [CALayer layer];
    2. imgLayer1.position = CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2);
    3. imgLayer1.bounds = self.bounds;
    4. imgLayer1.contents = (id)[[UIImage imageNamed: @"layer1.png"] CGImage];
    5. [self.layer addSublayer: imgLayer1];CALayer *imgLayer2 = [CALayer layer];
    6. imgLayer2.position = CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2);
    7. imgLayer2.bounds = self.bounds;
    8. imgLayer2.contents = (id)[[UIImage imageNamed: @"layer1.png"] CGImage];
    9. [self.layer addSublayer: imgLayer1];[self.layer addSublayer: imgLayer2];


    Andererseits habe ich auch schon Ansaetze mittels CoreGraphics gesehen, wo 2 Images mittels CGContextDrawImage in ein CGContextRef gezeichnet werden.
    Wie wuerdet ihr am ehesten an die Sache rangehen...
    Zugegebenermassen bin ich noch recht blau hinter den Ohren was CoreGraphics angeht. Deshalb habe ich auch noch nicht viel in der Dokumentation gefunden,
    da ich nicht wirklich weiss wonach ich suchen muss...
    Gruss
    der Chris
  • Die Frage ist, was willst Du?
    Der entscheidende Unterschied ist, dass Du Layer animieren kannst. Es macht also Sinn, es nicht ineinander zu zeichnen.
    Die Bilder werden erst zum Anschauen zusammen gefügt und sind veränderlich.
    Andererseits, wenn Du mit UIImage experimentierst, willst Du wahrscheinlich das genau tun.
    I would be embarrassed if they did not spy on me.
  • longW schrieb:

    Die Frage ist, was willst Du?
    Der entscheidende Unterschied ist, dass Du Layer animieren kannst. Es macht also Sinn, es nicht ineinander zu zeichnen.
    Die Bilder werden erst zum Anschauen zusammen gefügt und sind veränderlich.
    Andererseits, wenn Du mit UIImage experimentierst, willst Du wahrscheinlich das genau tun.
    Ich will eigentlich nur 3 (teilweise transparente) UIImages überlagern und das Ergebnis in einer UIImageView darstellen. Allerdings nicht einmalig, da sich der Inhalt der 3 Layer ändern kann und das ganze immer wieder neu gezeichnet werden muss!
    Da ich also nichts animieren will brauche ich die CALayer ja im Prinzip nicht. Also würde ich mein Hintergrundimage einfach in eine UIImageView packen, jeden der 3 Layer in eine eigene UIImageView zeichnen und diese dann mittels

    Quellcode

    1. [backgroundView addSubview:layer1]
    2. [backgroundView addSubview:layer2]
    3. [backgroundView addSubview:layer3]
    überlagern?
    Oder gibt es da eine geschicktere Methode?
  • chrizztus schrieb:

    longW schrieb:

    Die Frage ist, was willst Du?
    Der entscheidende Unterschied ist, dass Du Layer animieren kannst. Es macht also Sinn, es nicht ineinander zu zeichnen.
    Die Bilder werden erst zum Anschauen zusammen gefügt und sind veränderlich.
    Andererseits, wenn Du mit UIImage experimentierst, willst Du wahrscheinlich das genau tun.
    Ich will eigentlich nur 3 (teilweise transparente) UIImages überlagern und das Ergebnis in einer UIImageView darstellen. Allerdings nicht einmalig, da sich der Inhalt der 3 Layer ändern kann und das ganze immer wieder neu gezeichnet werden muss!
    Da ich also nichts animieren will brauche ich die CALayer ja im Prinzip nicht. Also würde ich mein Hintergrundimage einfach in eine UIImageView packen, jeden der 3 Layer in eine eigene UIImageView zeichnen und diese dann mittels

    Quellcode

    1. [backgroundView addSubview:layer1]
    2. [backgroundView addSubview:layer2]
    3. [backgroundView addSubview:layer3]
    überlagern?
    Oder gibt es da eine geschicktere Methode?



    Also Bilder.
    Entweder Du benutzt die -compositeXXX Methoden von UIImage, nacheinander für jedes Bild.
    Wenn Du nach den Methoden und UIImage suchst, findest Du sicher Beispiele.
    Oder Du gehst gleich über CoreGraphics.
    Die wichtigste Seite der Doku ist dann Quartz 2D
    I would be embarrassed if they did not spy on me.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von longW ()

  • Thallius schrieb:

    Warum nimmst Du nicht einfach 3 ImageViews und legst die übereinander. Dann brauchst du gar nicht mit irgendwelchen Layern rumbasteln.

    Gruß

    Claus


    Das geht natürlich auch. Aber erstmal auf den Schirm zu zeichnen und dann das Bild über den Kontext quasi als Screenshot zu lesen halte ich nicht für den direktesten Weg.
    I would be embarrassed if they did not spy on me.
  • Also normal würde ich jetzt raten einen neuen Context anzulegen, dann die 3 Bilder hineinzuzeichnen und das wieder als UIImage zu speichern.
    Dazu brauchts keine extra View oder das überschreiben von drawRect.

    Allerdings macht man sowas normal aus Gründen der Performance wenn man dauerhaft aus mehreren Bildern eines erstellen will.

    Da du schreibst, dass die Bilder sich immer wieder ändern und du es neu zeichnen musst, stellt sich die Frage wie sinnvoll das ist.
    Gibt es denn irgendwas, das gegen die einfachste Methode mit 3 übereinander liegenden UIImageViews spricht?
  • Tobse001 schrieb:



    Da du schreibst, dass die Bilder sich immer wieder ändern und du es neu zeichnen musst, stellt sich die Frage wie sinnvoll das ist.
    Gibt es denn irgendwas, das gegen die einfachste Methode mit 3 übereinander liegenden UIImageViews spricht?


    Das war auch die Grundlage meines Vorschlages. Wenn ich nur alle paar Sekunden da mal ein Bild austauschen will, dann macht es keinen Sinn da selber was zu composen denke ich.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • @Tobse001:
    Nee spricht nichts dagegen...
    Hab jetzt doch die Images in einen neuen Context gezeichnet.
    Sieht jetzt wie folgt aus:

    Quellcode

    1. UIImage *baseImage = [UIImage imageNamed:@"background.png"];
    2. CGRect frame = CGRectZero;
    3. frame.size = baseImage.size;
    4. // create a new image context
    5. UIGraphicsBeginImageContext(baseImage.size);
    6. // get context
    7. CGContextRef context = UIGraphicsGetCurrentContext();
    8. // clear context
    9. CGContextClearRect(context, frame);
    10. // draw images
    11. [baseImage drawInRect:frame];
    12. [imageLayer1 drawInRect:frame];
    13. [imageLayer2 drawInRect:frame];
    14. [imageLayer3 drawInRect:frame];
    15. // blendMode:kCGBlendModeNormal alpha:1.0];
    16. // get UIImage
    17. UIImage *overlaidImage = UIGraphicsGetImageFromCurrentImageContext();
    18. // clean up context
    19. UIGraphicsEndImageContext();
    Alles anzeigen


    Danke fuer eure Tipps