2010-10-06 6 views
5

Ich versuche etwas zu tun, was theoretisch ziemlich einfach sein sollte, aber ich habe meinen Schwanz seit Tagen gejagt. Ich versuche, ein Berührungsereignis von einer Bildschirmüberlagerung zu nehmen, ein Bild aufzunehmen und einen Bereich des Bildes an der Stelle, an der sich der Finger berührt hat, zu beschneiden.Gute Möglichkeit, CGImageCreateWithImageInRect, UIImage und UIImagePickerController Fragen zu verwenden

Jetzt funktioniert alles mein Code, die Überlagerung, Ereignisse, Zuschneiden usw. .... aber ich kann nicht scheinen, um das Koordinatensystem des Berührungsereignisses zu erhalten, um das Koordinatensystem des UIImage zusammenzubringen. Ich habe alle Dokumente gelesen, die ich in die Finger bekommen kann, ich kann es einfach nicht herausfinden.

Meine Hauptfrage ist, muss ich UIImageOrientation bei der Verwendung von CGImageCreateWithImageInRect berücksichtigen, oder Quarz es herausfinden? Der Grund, warum ich frage, ist, dass ich eine sehr einfache Routine habe, die Bilder gut schneidet, aber das zugeschnittene Bild scheint nie dort zu sein, wo mein Finger gedrückt hat ??

Der größte Teil der Routine ist:

-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
UIImage *image = =[info objectForKey:@"UIImagePickerControllerOriginalImage"]; 
float scaleX = image.size.width/SCREEN_WIDTH; 
float scaleY = image.size.height/SCREEN_HEIGHT; 
     //lastTouch is saved from touchesBegan method 
float x = (lastTouch.x * scaleX) - (CROP_WIDTH/2); 
float y = (lastTouch.y * scaleY) - (CROP_WIDTH/2); 
if(x < 0) x = 0.0; 
if(y < 0) y = 0.0; 
     CGRect cropArea = CGRectMake(x, y, CROP_WIDTH, CROP_WIDTH); 
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropArea); 
UIImage *swatch = [UIImage imageWithCGImage:imageRef]; 

     //at this point I'm just writing the images to the photo album to see if 
     //my crop is lining up with my touch 
     UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil); 
     UIImageWriteToSavedPhotosAlbum(swatch, nil, nil, nil); 
} 

das Problem ist also, dass mein beschnittenen Bereich (wie in meinem Fotoalbum gesehen) nie die tatsächliche Fläche entspricht, die ich (es ist immer ein anderer zufälliger Teil drücken des Fotos), was mich denken lässt, dass mein Koordinatensystem ausgeschaltet ist.

Alle Zeiger würden sehr geschätzt werden, auch wenn dort nur Zeiger auf einige Dokumente ich noch nicht gefunden habe.

Prost Adam

Antwort

0

Sie müssen immer daran denken, dass das Standard-System ist zwischen Core Graphics und UIKit verschiedenen koordinieren. Während UIKit mit seinem Ursprung in der oberen linken Ecke des Fensters beginnt, hat CoreGraphics diesen Punkt unten links gesetzt. Ich denke, das könnte genug Informationen sein, um Sie auf die richtige Spur zu bringen, aber nur zu wiederholen:

Sie können diesen Code verwenden, um Ihr Koordinatensystem zu invertieren oder umzudrehen.

CGContextTranslateCTM(graphicsContext, 0.0, drawingRect.size.height); 
CGContextScaleCTM(graphicsContext, 1.0, -1.0); 

Überprüfen Sie auch Flipping die Standard Sytem Koordinaten in der Drawing and Printing Guide for iOS

Verwandte Themen