2009-08-10 8 views
7

Ich habe das Gefühl, dass dies keine leichte Aufgabe ist, aber ich muss ein UIImageView mit einer anderen UIImage-Ansicht, die darüber liegt, kombinieren oder abflachen. Zum Beispiel: Ich habe zwei UIImageViews. Einer von ihnen hat ein Bild von einem grasbewachsenen Feld (1200 x 1200 Pixel). Das andere ist ein Bild eines Basketballs (128 x 128 Pixel), und es ist so über dem Bild des Grasfeldes positioniert, dass der Basketball scheinbar auf dem Grasfeld liegt. Ich möchte in der Lage sein, die überlagerten UIImageViews als eine einzelne Bilddatei zu meinem Fotoalbum zu speichern, was bedeutet, dass ich die beiden Bilder irgendwie kombinieren muss. Wie würde dies erreicht werden? (HINWEIS: Einen Screenshot (320 x 480 Pixel) nicht eine akzeptable Lösung sein, wie ich will die Größe von 1200 x 1600 Pixeln erhaltenWie man mehrere UIImageViews in EINEN "glättet"?

FRAGE:. ​​
Wie kann ich mehrere UIImageViews in ein und SPAREN abflachen das resultierende Bild unter Beibehaltung der Größe/Auflösung

Antwort

3

Dies nimmt jede Sicht und macht einen UIImage daraus. Jede Ansicht und ihre Unteransichten werden zu einem UII-Bild "abgeflacht", das Sie anzeigen oder auf der Festplatte speichern können.

- (UIImage*)imageFromView{ 

    UIImage *image; 

    UIGraphicsBeginImageContext(self.view.bounds.size); 
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 

} 
+0

Übrigens, Corey, gibt es eine Möglichkeit, dies zu tun (Ihren obigen Code), während die Bildauflösung der Ansicht, die die Basisschicht (self.view.layer in Ihrem Code) ist, erhalten bleibt? Ich habe ein Foto in der Größe 1200 x 1600, aber nach der Verarbeitung (mit Ihrem Code) hat das resultierende Bild die Pixelgröße des UIImageView, das sein Container (320 x 427) war. – RexOnRoids

+0

Ich kann nicht sicher sagen, aber die Taktik von Tequilatango scheint dies zu erreichen. Die Methode, die ich verwende, wird nur erfassen, was auf dem Bildschirm bei der Bildschirmauflösung angezeigt wird. Es ist schnell und schmutzig, aber funktioniert. Wenn Sie bessere Ergebnisse benötigen, müssen Sie das Bild wie dargestellt in den Puffer zeichnen. Natürlich, da dies das iPhone ist, wenn es eine Möglichkeit für Sie gibt, die Größe Ihrer Bilder zu verringern, ohne UX zu beeinflussen, dann sollten Sie es aus Gründen der Speicher/Leistung berücksichtigen. –

+0

Um die Bildauflösung beizubehalten, verwenden Sie 'UIGraphicsBeginImageContextWithOptions (self.view.bounds.size, NO, 0.0)' –

5

Warum zeichnen Sie nicht einfach Original-UIImages in einen Hintergrundpuffer übereinander und schreiben dann ein kombiniertes Bild in eine Datei? Unten finden Sie ein Beispiel, wie Sie können zeichne zwei Bilder in denselben Puffer:

CGImageRef bgimage = [bguiimage CGImage]; 
width = CGImageGetWidth(bgimage); 
height = CGImageGetHeight(bgimage); 

// Create a temporary texture data buffer 
GLUbyte* data = (GLubyte *) malloc(width * height * 4); 
assert(data); 

// Draw image to buffer 
CGContextRef ctx = CGBitmapContextCreate(data, width, height, 8, width * 4, CGImageGetColorSpace(image), kCGImageAlphaPremultipliedLast); 
assert(ctx); 

// Flip image upside-down because OpenGL coordinates differ 
CGContextTranslateCTM(ctx, 0, height); 
CGContextScaleCTM(ctx, 1.0, -1.0); 

CGContextDrawImage(ctx, CGRectMake(0, 0, (CGFloat)width, (CGFloat)height), bgimage); 

CGImageRef ballimage = [balluiimage CGImage]; 
bwidth = CGImageGetWidth(ballimage); 
bheight = CGImageGetHeight(ballimage); 

float x = (width - bwidth)/2.0; 
float y = (height - bheight)/2.0; 
CGContextDrawImage(ctx, CGRectMake(x, y, (CGFloat)bwidth, (CGFloat)bheight), ballimage); 

CGContextRelease(ctx); 
+0

Danke für diesen Vorschlag. Behält dies die Auflösung/Pixel der Originalbilder bei oder haben sie die gleiche Größe wie die Ansichten, die sie enthalten? – RexOnRoids

+0

Es behält die Auflösung, weil Sie das ursprüngliche Bild zeichnen. –

Verwandte Themen