Frage

Ich versuche, einige Transformationen auf Bilder mit einem CGContextRef anzuwenden. Ich bin mit CGContextTranslateCTM, CGContextScaleCTM und CGContextRotateCTM Funktionen, aber die Dinge einfach zu halten, können nur die erste auf das Wesentliche konzentrieren. Ich frage mich, warum der folgende Code erzeugt genau das Originalbild ?! Bin ich etwas fehlt?

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGContextRef g = CGBitmapContextCreate((void*) pixelData, 
                                                       width, 
                                                       height, 
                                                       RGBA_8_BIT, 
                                                       bytesPerRow, 
                                                       colorSpace, 

                                                   kCGImageAlphaPremultipliedLast);

CGContextSetShouldAntialias(g, YES);

CGContextSetInterpolationQuality(g, kCGInterpolationHigh);

CGContextTranslateCTM( g,translateX, translateY );


CGImageRef tempImg  = CGBitmapContextCreateImage (g);
CGContextDrawImage( g, CGRectMake (0, 0, width, height), tempImg );
CGContextRelease(g);
CGColorSpaceRelease( colorSpace );

Auch nach der Übersetzung, wie ein anderes Bild auf diesem zu ziehen, jedoch mit teilweise Transparenz (zB alpha = 0,5).

Ich habe eine Menge gesucht, aber nicht gefunden haben, eine Antwort, jede Hilfe ist willkommen ...:)

Bitte beachten Sie, dass ich den Zusammenhang von Pixeldata erschaffe, und dass tempImg wird nach der Übersetzung erstellt. Es ist nichts falsch in der Initialisierung, wie das Originalbild wird derzeit produziert, aber das Problem ist mit der Übersetzung Ich nehme an ..

War es hilfreich?

Lösung

Transformationen auf die Grafiken nur Zustand folgende Zeichenoperationen beeinflussen - sie nicht die vorhandenen Bilddaten ändern. Wenn Sie Transformationen anwenden, um ein Bild, versuchen Sie so etwas wie folgt aus:

  1. Erstellen Sie eine leere CGContext (auf dem iPhone verwenden UIGraphicsBeginImageContext)
  2. Übersetzen, skalieren oder drehen es Grafiken Zustand
  3. Zeichnen vorhandenes Bild hinein.
  4. Get Bild von neuen CGContext (auf dem iPhone verwenden UIGraphicsGetImageFromCurrentImageContext)

Wenn Sie Schritt 3 durchführen, wird das bestehende Bild in Ihren neuen Grafikkontext gezeichnet mit den Transformationen angewandt. Der Trick dabei ist, dass, um die Transformationen anzuwenden, müssen wir tatsächlich etwas ziehen.

Sie können auf diese Weise ein paar wirklich coole Dinge mit Transformationen tun. Sie können die Hälfte Ihr Bild zeichnen, gelten einige Transformationen, und etwas mehr ziehen.

Andere Tipps

Wie in anderen Antworten erwähnt, Transformationen gelten nur für nachfolgende Zeichenoperationen; sie haben keinen Einfluss auf die Pixelpuffer Sie mit gestartet.

So haben Sie eine Ziehoperation benötigen. Die Lösung ist auf erstellen CGImage ; Zeichnung das Bild ein Ziehvorgang ist, so wird es an die aktuelle Transformationsmatrix (CTM) unterliegen.

Schritt-für-Schritt:

  1. Erstellen Sie den Kontext mit leer Pixeldaten. (Wenn Sie NULL für die Puffer passieren, Quartz sollte sie für Sie. Das ist auf dem Mac funktioniert jedenfalls.)
  2. Erstellen Sie das Bild mit dem Pixeldaten zu zeichn umgewandelt werden soll.
  3. Verändern die CTM im Kontext.
  4. Zeichnen Sie das Bild.

Sie haben CGBitmapContextCreateImage () nach rufen Sie das Bild ziehen.

Dann können Sie ein anderes Bild auf dem ersten zeichnen und rufen CGBitmapContextCreateImage () erneut das zweite Bild zu erhalten. Sie können die Alpha mit CGContextSetAlpha (CTX, alphaValue) gesetzt;

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top