2011-01-05 6 views
1

Ich würde gerne wissen, ob mir jemand in die richtige Richtung zeigen kann, welche Frameworks/Methoden zu verwenden, wenn Sie einen Block von Pixeln in einem Bild mit ersetzen ein weiterer Pixelblock.iPhone - Ersetzen eines Blocks von Pixeln in einem Bild durch einen anderen Block von Pixeln

Zum Beispiel sagen wir, ich habe ein einfaches Bild vollständig rot gefärbt und ich betrachte meine Pixelblockgröße als 5x5 Pixel. Jetzt will ich alle 3 Blöcke den 3. Block durch einen blauen Block (5x5 Pixel) ersetzen, also , dass es zu einem roten Bild mit blauen Blöcken kommen würde, die alle 3 roten Blöcke erscheinen.

Ich habe Informationen zum Pixelersatz gefunden, versuche aber herauszufinden, wie Pixelblöcke ermittelt und verarbeitet werden. Jeder Rat würde geschätzt werden .. und jeder Code wäre ein feuchter Traum.

+0

Wo sind die Pixel? Eine Bilddatei, die Sie bearbeiten, oder in einer Live-Ansicht auf dem Bildschirm? –

+0

In Live-Ansicht auf dem Bildschirm. – Zigglzworth

Antwort

1

Obwohl es wie eine einfache Frage klingen mag, ist es nicht ganz einfach, so etwas zu tun. Sie benötigen eine Menge Hintergrundinformationen, um alles in Gang zu bringen. Es hängt auch davon ab, woher das Bild kommt und was Sie damit machen wollen.

Ich will nicht, dass Sie mit einem Arbeitsbeispiel liefern, aber hier ist einige Hinweise:

Lesen in einem Bild:

UIImage *img = [UIImage imageNamed:@"myimage.png"]; 
// make sure you added myimage.png to your project 

Erstellen eines eigenen "Grafikkontext" zeichnen auf:

UIGraphicsBeginImageContext(CGSizeMake(480.0f, 320.0f)); // the size (width,height) 
CGContextRef ctx = UIGraphicsGetCurrentContext(); 

Malen Sie Ihr Bild auf Ihren (aktuellen) Kontext:

[img drawAtPoint:CGPointMake(0.0f, -480.0f)]; // (draws on current context) 

eine andere Malerei tun:

CGContextBeginPath(ctx); // start a path 
CGContextSetRGBStrokeColor(ctx,1,0,0,1); // red,green,blue,alpha with range 0-1 
CGContextMoveToPoint(ctx,50,0); // move to beginning of path at point (50,0) 
CGContextAddLineToPoint(ctx,100,100); // add a line to point (100,100) 
CGContextStrokePath(ctx); // do the drawing 

Umwandlung der Bitmap-Kontext zu einem Bild wieder:

UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext(); 

Und dann entweder:

Zeigen Sie das Bild an das Publikum, von innen ein Ansichtssteuerung:

[self.view addSubview:[[[UIImageView alloc] initWithImage:resultImage] autorelease]]; 

Oder schreiben Sie das Bild als JPEG:

NSData *imagedata = UIImageJPEGRepresentation(img,0.8); // 0.8 = quality 
[imagedata writeToFile:filename atomically:NO]; 

oder als PNG:

NSData *imagedata = UIImagePNGRepresentation(img); 
[imagedata writeToFile:filename atomically:NO]; 

Für die letzten, müssen Sie einen Dateinamen haben, die nicht so trivial ist entweder (angesichts der Telefonumgebung Sie leben im). Das ist ein anderes Thema, zu dem Sie eine Menge finden, suchen für Dinge wie:

NSArray *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
NSString *filename = [[path elementAtIndex:0] stringByAppendingPathComponent:@"myimage.png"]; 

Dies ist der allgemeine Umriss, könnte ich einige Fehler gemacht haben, aber dies sollte erhalten Sie zumindest gehen.

+0

Weitere Informationen: http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CGContext/Reference/reference.html und viele andere Apple Docs. – mvds

+0

So wird der tatsächliche Pixelblock erstellt mit: UIGraphicsBeginImageContext (CGSizeMake (480.0f, 320.0f)); CGContextRef ctx = UIGraphicsGetCurrentContext(); ? – Zigglzworth

+0

Nun, das ist ein Weg. Eine andere wäre, mit einem Bitmap-Kontext zu beginnen, mit 'CGContextRef ctx = CGBitmapContextCreate (baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); aber wie Sie sehen, erfordert das viel mehr Aufwand (Sie brauchen um den Speicher zuzuweisen und Parameter zu bestimmen), aber es macht, dass Sie tatsächlich auf der Pixelebene im Speicher bearbeiten können. Sie können dann 'CGImageRef cgimage = CGBitmapContextCreateImage (ctx);', um ein 'cgimage' zu ​​erhalten, mit dem Sie ein' UIImage' erstellen können. – mvds