Как сохранить изображение с помощью UIImageWriteToSavedPhotosAlbum после его преобразования - PullRequest
3 голосов
/ 20 июля 2010

Хорошо, я обыскал все, и я не могу найти ответ, который мне нужен.: - (

Вот что я делаю и что мне нужно сделать. У меня есть UIImageView, который я могу преобразовать с помощью UIPanGestureRecognizer, UIRotationGestureRecognizer и UIPinchGestureRecognizer - все это прекрасно работает. Проблема возникает тогда, когда это так.время, чтобы сохранить эти преобразования в моем фотоальбоме. Результаты не то, что я ожидаю. Пока вот код, который я использую (хотя-бы очень неполный)

-(IBAction)saveface:(id)sender
{     

     static int kMaxResolution = 640;

     CGImageRef imgRef = face.image.CGImage;
     CGFloat width = CGImageGetWidth(imgRef);
     CGFloat height = CGImageGetHeight(imgRef);

     CGRect bounds = CGRectMake(0, 0, width, height);
     if (width > kMaxResolution || height > kMaxResolution) {
          CGFloat ratio = width/height;
          if (ratio > 1) {
               bounds.size.width = kMaxResolution;
               bounds.size.height = bounds.size.width / ratio;
          } else {
               bounds.size.height = kMaxResolution;
               bounds.size.width = bounds.size.height * ratio;
          }
     }


     UIGraphicsBeginImageContext(bounds.size);
     CGContextRef context = UIGraphicsGetCurrentContext();

     CGContextScaleCTM(context, 1, -1);
     CGContextTranslateCTM(context, 0, -height);


     NSLog(@"SAVE  TX:%f TY:%f A:%f B:%f C:%f D:%f", face.transform.tx, face.transform.ty, face.transform.a,face.transform.b,face.transform.c,face.transform.d);
     CGFloat x = face.transform.tx;
     CGFloat y = face.transform.ty;

     CGContextTranslateCTM (context, x,-y);

     CGContextConcatCTM(context, face.transform);

     CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef);
     UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();

     UIGraphicsEndImageContext();


     UIImageWriteToSavedPhotosAlbum(imageCopy, self, nil, nil);


}

Из этого метода яЯ могу сохранить изображение, однако координаты находятся далеко. Я вижу любое масштабирование, которое я сделал, которое работает нормально. Я вижу свое вращение, но оно кажется обратным, и панорамирование отключено.

Координатывсе неправильно, и я не могу понять, в чем дело. Я признаю, что я новичок в Objective-C, и я никогда раньше не использовал Quartz 2D, и мое понимание матриц преобразования ограничено. Я понимаю, что моепреобразования не в самих данных изображения, а в попытке сохранить изображение без применения этого контекстаничего не делает.Так что, пожалуйста, кто-нибудь может объяснить мне это?

Ответы [ 2 ]

2 голосов
/ 02 декабря 2010

Как правило, вы хотите перевести, прежде чем масштабировать.

Вы перевернули свою систему координат, но вы все еще назначаете старые значения x и y. Я думаю, что вы должны иметь:

 CGFloat y = face.transform.tx;
 CGFloat x = face.transform.ty;

Объект face не определен в этом коде. Если он выключен, все остальное будет выключено. Если это свойство, вы должны использовать справочную форму self.face, чтобы убедиться, что к ней обращаются правильно.

Я бы рекомендовал выполнять масштабное преобразование последним.

Если ничего из этого не работает. Закомментируйте все преобразования, кроме одного, и посмотрите, работает ли это преобразование. Затем добавьте остальные, пока не получится.

0 голосов
/ 07 декабря 2010

Этот вид работы намного проще, если вы создаете изображение в UIView, трансформируете, масштабируете и затем визуализируете слой. Это экономит все виды хлопот позже.

Что-то вроде:

CGSize vscaledSize = myOriginalImage.size;

//add in the scaled bits of the view
//scaling
CGFloat wratio = vscaledSize.width/self.pictureView.frame.size.width;
CGFloat vhightScaled = self.pictureView.frame.size.height * wratio;
vscaledSize.height = vhightScaled;

CGFloat hratio = vscaledSize.height/self.pictureView.frame.size.height;

//create context
UIGraphicsBeginImageContext(myOriginalImage.size);
CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSaveGState(context); //1 original context

// translate/flip the graphics context (for transforming from CG* coords to UI* coords
CGContextTranslateCTM(context, 0, vscaledSize.height);
CGContextScaleCTM(context, 1.0, -1.0);

//original image
CGContextDrawImage(context, CGRectMake(0,0,vscaledSize.width,vscaledSize.height), myOriginalImage.CGImage);

CGContextRestoreGState(context);//1  restore to original;

//scale context to match view size
CGContextSaveGState(context); //1 pre-scaled size
CGContextScaleCTM(context, wratio, hratio);

//render 
[self.pictureView.layer renderInContext:context];

CGContextRestoreGState(context);//1  restore to pre-scaled size;

UIImage *exportImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Вы заметите, что я перевернул систему координат для рендеринга изображения, но восстановил его в исходную систему координат для рендера UIView.layer.

Надеюсь, это поможет

...