2010-07-20 5 views
3

좋아요. 검색을 끝내고 필요한 답을 찾을 수없는 것 같습니다. :-(변환 후 UIImageWriteToSavedPhotosAlbum을 사용하여 이미지를 저장하는 방법

여기 내가하고있는 일과 내가해야 할 일이있다. 나는 UIPanGestureRecognizer, UIRotationGestureRecognizer 및 UIPinchGestureRecognizer를 사용하여 transfrom 할 수있는 UIImageView를 가지고있다. 문제는 시간이되면된다. 내 포토 앨범에 그 transfomations을 저장합니다. 결과는 내가 기대하고 있지 무엇인가. 지금까지 여기 내가 사용하고있는 코드입니다 (알은 - 수 - 그것은 매우 불완전한) I 저장할 수 있어요이 방법에서

-(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

일반적으로 크기를 조정하기 전에 번역해야합니다.

좌표계를 뒤집었지만 이전 x 및 y 값은 할당합니다. 나는 당신이 가지고 있어야한다고 생각합니다 :

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

face이 코드에는 객체가 정의되어 있지 않습니다. 꺼져 있으면 다른 모든 것이 꺼집니다. 속성 인 경우 self.face 참조 양식을 사용하여 올바르게 액세스되는지 확인해야합니다.

스케일 변환을 마지막으로 수행하는 것이 좋습니다.

아무 것도 작동하지 않는 경우. 하나의 변환을 제외한 모든 것을 주석 처리하고 해당 단일 변환이 작동하는지 확인하십시오. 그런 다음 실패 할 때까지 다른 사람을 추가하십시오.

0

이러한 종류의 작업은 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(); 

당신은 내가 이미지 렌더링을위한 COORD 시스템을 플립 것을 알 수 있지만, 렌더링 UIView.layer의 원래 좌표계로 복원 할 수 있습니다.

희망이 도움이되었습니다.

관련 문제