2012-08-22 4 views
0

사진을 찍을 수있는 앱을 작성해야하며이를 미리보고 그래픽과 어쩌면 텍스트를 오버레이 한 다음 다시 이미지 라이브러리에 저장하십시오.이미지에 텍스트와 그래픽을 오버레이하는 그래픽 라이브러리 및 기능

그래서 내 사용자는 UIImagePickerController를 사용하여 카메라에 액세스하고 위임을 통해 이미지 데이터를 가져올 내 앱을 시작합니다.

그런 다음 화면에 표시하고 컨트롤을 표시하여 시각적 이미지 (또는 로고)를 추가하고 사용자에게 한두 줄의 텍스트를 추가 할 수있는 옵션을 제공하려는 경우 사진.

사용자가 저장을 클릭하면 합성 된 이미지가 카메라 롤/사진 라이브러리에 기록되어 사용자가 필요에 따라 트위터, 페이스 북 등으로 이미지를 업로드 할 수 있습니다. 다른 사람의 문제 일 수있는 OAuth2).

그래서 내가 알아야 할 것은 SDK에서 사용할 수있는 많은 라이브러리 중 어떤 것을 사용하게 할 것입니까? CGImage? 내 오버레이 로고가 투명한 PNG가 될 경우 다른 오버레이를 어떻게 오버레이합니까?

나는 CALayer로 선물 할 수 있다고 들었지만, 어떻게 모든 레이어를 함께 (평평하게) 잡을 지 모르겠습니다.

PHP에서는 imagecopymerge()와 같은 것을 사용합니다. 동등한 것을 알아 내는데 어려움이 있습니다.

웹 서버에 데이터를 전달하고 원래대로 되돌릴 수는 없다는 것을 알고 있습니다.

감사

답변

2

그럼 난 그냥 다음 라벨에 텍스트를 넣어 입력을 얻을 수있는 텍스트 필드를 사용할 수 있습니다 확신 이미지에 텍스트를 추가합니다. 이 부분은 몇 가지 다른 방법으로 수행 할 수 있지만 매우 쉽습니다.

모든 레이어의 결합 된 이미지를 잡는 한 Quartz를 사용할 수 있습니다.

모든 UIWindow (UIView에서 상속) 및 UIView은 CALayer로 지원됩니다. CALayer/-renderInContext: 메서드를 사용하면 레이어와 그 하위 레이어를 그래픽 컨텍스트로 렌더링 할 수 있습니다. 따라서 전체 화면의 스냅 샷을 잡으려면 화면의 각 창을 반복하고 해당 계층 구조를 대상 컨텍스트로 렌더링 할 수 있습니다. 작업이 완료되면 아래와 같이 UIGraphicsGetImageFromCurrentImageContext 함수를 통해 스크린 샷 이미지를 얻을 수 있습니다.

CALayer/-renderInContext:은 UIKit 및 Quartz 도면 만 캡처한다는 점에 유의하십시오. OpenGL ES 또는 비디오 내용을 캡처하지 않습니다.

#import <QuartzCore/QuartzCore.h> 

.....

- (UIImage*)screenshot 
{ 
    // Create a graphics context with the target size 
    // On iOS 4 and later, use UIGraphicsBeginImageContextWithOptions to take the scale into consideration 
    // On iOS prior to 4, fall back to use UIGraphicsBeginImageContext 
    CGSize imageSize = [[UIScreen mainScreen] bounds].size; 
    if (NULL != UIGraphicsBeginImageContextWithOptions) 
     UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0); 
    else 
     UIGraphicsBeginImageContext(imageSize); 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // Iterate over every window from back to front 
    for (UIWindow *window in [[UIApplication sharedApplication] windows]) 
    { 
     if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen]) 
     { 
      // -renderInContext: renders in the coordinate space of the layer, 
      // so we must first apply the layer's geometry to the graphics context 
      CGContextSaveGState(context); 
      // Center the context around the window's anchor point 
      CGContextTranslateCTM(context, [window center].x, [window center].y); 
      // Apply the window's transform about the anchor point 
      CGContextConcatCTM(context, [window transform]); 
      // Offset by the portion of the bounds left of and above the anchor point 
      CGContextTranslateCTM(context, 
            -[window bounds].size.width * [[window layer] anchorPoint].x, 
            -[window bounds].size.height * [[window layer] anchorPoint].y); 

      // Render the layer hierarchy to the current context 
      [[window layer] renderInContext:context]; 

      // Restore the context 
      CGContextRestoreGState(context); 
     } 
    } 

    // Retrieve the screenshot image 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return image; 
} 

지금까지 페이스 북과 트위터에 업로드로 ShareKit를보십시오. Facebook, Twitter, Tumblr, 이메일 등으로 공유하기위한 드래그 앤 드롭 라이브러리입니다. 이렇게하면 앱에 가치가 추가됩니다. 그것을 구현하는 것이 좋습니다.

+0

저는이 아이디어가 마음에 들었습니다. 특정 UIView에서 작동하도록 조정할 수 있었습니까? 그렇다면 iPad에서 앱을 작성한 경우 오른쪽의 배율 조정 된 UIView와 왼쪽의 옵션에서 결합 된 이미지의 미리보기를 표시 할 수 있었지만 모든 UIView 캡처? 내가 subviews iterating의 사건이 될 것 같아요? – JamesB

+0

화면의 모든 창을 반복하는 대신 UIView를 통해 이동하십시오. – random

+0

고마워. 코리, 방금 공유 키즈에 대한 링크를 발견했는데, 확실히 살펴볼 것입니다. 현재이 앱은 사적인 용도의 앱이 될 것입니다. (모든 사람들이 어떻게 시작했는지는 모르겠지만) 곧 출시 될 수 있습니다. 그것을 시험해 보았습니다. UIView에는 UIImage가 포함되고 UIImage는 포함 된 뷰 오른쪽으로 확장되도록 설정할 수 있습니까? 사람들이 장치에 로고를 붙일 수있는 방법을 생각하려고했지만 사진 라이브러리에 추가하고 위치 컨트롤을 제공하는 것이 가장 UI 친화적 인 방법 인 것 같습니다. – JamesB

관련 문제