iOS2013.01.21 09:30

iOS4.0 부터 지원하는 ALAssetLibrary framework를 사용하면 UIImagePickerController를 사용하지 않아도 사용자 iOS기기에 저장되어 있는 사진 또는 비디오를 가져 올수 있다. 


ALAasetLibrary는 크게 ALAasetsLibrary > ALAssetsGroup > ALAsset 으로 이루어져 있고, ALAssetLibrary를 통해 ALAssetsGroup를 부르고 ALAssetsGroup을 통해 최종적으로 사진 또는 비디오 정보를 가지고 있는 ALAsset을 가져 온다. 이 문서는 ALAssetLibrary 자체를 다루는 내용이 아니기 때문에 불러오는 방법에 대해서는 생략 한다.


ALAsset 클래스를 보면 defaultRepresentation 이 있고 여기에 실제 이미지 정보를 가지고 있다. 물론 Exif 정보나 thumbnail은 defaultRepresentation을 거치지 않아도 ALAsset을 통해 바로 불러 올수 있다.


thumbnail, fullscreenImage, fullResolutionImage를 불러오는 방법은 다음과 같다.



// thumbnail
CGImageRef imageRef = CGImageCreateCopy(asset.thumbnail); UIImage *thumbnail = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); // fullScreen 화면에 맞는 크기의 이미지 CGImageRef imageRef = CGImageCreateCopy(asset.defaultRepresentation.fullScreenImage); UIImage *fullScreenImage = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); // fullResolution 원본 이미지 CGImageRef imageRef = CGImageCreateCopy(asset.defaultRepresentation.fullResolutionImage); UIImage *fullResolutionImage = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef);


위의 3가지 크기를 이용하면 대부분의 앱개발이 가능 하겠지만, fullScreenImage, fullResolutionImage는 생성을 할때 많은 연산이 필요로 하므로 Performance에 문제가 생길수도 있다. 예를 들어 UITableView에서 fullScreenImage를 동시에 여러개를 생성한다면 어느 디바이스건 UI가 얼어 버리는 현상이 발생한다. 


그럼 fullScreenImage 보다는 작지만 thumbnail 보단 큰 이미지를 생성하려면 어떻게 해야 하는가? (fullScreenImage 보다 작은 이미지를 생성한다면 UI가 얼어 버리는 현상 발생 빈도를 줄어 들게 할 수 있을것이다)


필자가 찾은 방법은 AssetRePresentation의 getBytes를 통해 사진 또는 비디오에 대한 데이터를 불러온 뒤에 해당 데이터를 통해 CGImageRef를 생성하는 방법이다. 전달하는 size를 통해 이미지 크기를 조절 할 수 있다.

- (CGImageRef)getThumbnailWithALAsset:(ALAsset *)asset withSize:(float)size { ALAssetRepresentation *representation = asset.defaultRepresentation; CGImageRef imageRef = nil; NSData *data = nil; uint8_t *buffer = (uint8_t *)malloc(sizeof(uint8_t)*[representation size]); if (buffer != NULL) { NSError *error = nil; NSUInteger bytesRead = [representation getBytes:buffer fromOffset:0 length:[representation size] error:&error]; data = [NSData dataWithBytes:buffer length:bytesRead]; free(buffer); } if ([data length]) { CGImageSourceRef sourceRef = CGImageSourceCreateWithData((CFDataRef)data, nil); NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: (id)kCFBooleanTrue, kCGImageSourceCreateThumbnailFromImageIfAbsent, (id)kCFBooleanTrue, kCGImageSourceCreateThumbnailFromImageAlways, (id)[NSNumber numberWithFloat:size], kCGImageSourceThumbnailMaxPixelSize, (id)kCFBooleanTrue, kCGImageSourceCreateThumbnailWithTransform, nil]; imageRef = CGImageSourceCreateThumbnailAtIndex(sourceRef, 0, (CFDictionaryRef)options); if (sourceRef) CFRelease(sourceRef); } return imageRef;

}


위의 방법으로 생성된 CGImageRef 를 이용하여 이미지를 생성하면 된다. 단 비디오일 경우 AssetRepresentation을 메모리에 올리는 과정에서 비디오의 길이가 길 경우 (용량이 클 경우) 메모리 부족으로 앱이 죽어 버리는 경우가 있으니 ALAsset이 비디오일 경우에는 기존의 AssetRepresentation의 fullScreenImage 또는 fullResolution을 이용하는게 좋다.


또한 위의 방법을 이용하여 많은 이미지를 동시에 생성할 경우 생성할 당시 메모리가 많이 필요하므로 상황에 따라 주의에서 사용할 필요가 있다. 필자는 아직까진 이미지를 생성하면서 메모리가 부족에서 앱이 죽어 버리는 현상은 없었다. (단 ALAsset이 비디오일 때는 앱이 죽을수도 있다)




'iOS' 카테고리의 다른 글

[iOS] ALAsset으로 Custom Image 생성하기  (0) 2013.01.21
Posted by Flash 동강
Programming2012.06.04 09:00


 


 최근엔 "하이브리드 앱"이라는 용어가 마케팅으로 사용될 정도로 PhoneGap에 대한 관심이 많습니다. 하지만 아래와 같은 장점을 가지고 있지만 단점도 가지고 있습니다.


장점

- 기존 Javascript 코드를 부분적으로 재사용 가능

- 하나의 웹 코드 (HTML, CSS, Javascript)를 작성하면 부분적으로 여러 플랫폼(iOS, Android, Window Phone, Black berry, webOS, smybian, bada) 재사용 가능 


단점

- 웹베이스로 코드가 동작 되기 떄문에 비교적(Native App과 비교하면) 느리다.

- PhoneGap API들은 가장 기본이 되는 것만 제공해 준다. (PhoneGap API 참고 : http://docs.phonegap.com/en/1.7.0/index.html)

- Native 고유의 기능을 사용해야만 구현 할 수 있는 기능들이 있다 (예) Android의 Background Service


이러한 장.단점들을 가지고 있지만 단점들을 보면 정말 부족해 보입니다. 이 단점을 어느 정도 극복 하기 위한 방법이 각 플랫폼 별로 Plugin을 개발해서 사용하는 것 입니다.


PhoneGap Plugin

Plugin을 만든다는 것은 Native 코드를 이용해서 필요한 기능들 만들어서 사용한다는 것 입니다. iOS의 경우에는 Objective-C로 Android는 Java로 기존 Native에서 동작하는 코드를 PhoneGap Plugin 형식에 맞게 제공하여 PhoneGap을 이용한 앱에서 이를 사용할 수 있도록 합니다.


무엇을 할 수 있는가?

많은 연산을 필요로 하는 작업은 Native에서 처리 (더 빠르다?)

- PhoneGap API에 없는 기능들을 추가해서 사용 (Android의 Background service, 바이너리 이미지를 PhotoLibrary에 저장)

- Native 언어적으로 복잡한 비지니스 로직을 처리 하는 방법이 있을 경우 플러그인으로 만들어서 사용




개발 방법

PhoneGap Plugin은 Javascript코드와 Native코드 쌍으로 이루어져 있습니다. 여러 플랫폼에 대응하는 Plugin기능을 만드려면 플랫폼 마다 구현해 줘야 합니다. Javascript는 기본 인터페이스를 만들어 놓고 세부적인 내용은 플랫폼 별로 다르게 작성 되야 합니다.


PhoneGap 1.5 부터 Apache Cordova로 이름이 바뀌면서 덩달아 Namespace도 모두 바뀌었습니다. 아래 내용은 PhoneGap 1.5 이후 버전에 맞게 작성 되었습니다.


iOS (wiki : http://goo.gl/fNC4c)

예제 코드는 Javascript에서 Plugin으로 Hellow World 문자열을 전달하여 전달된 문자열이 Hellow World가 맞다면 성공, 아니면 실패를 반환하는 코드 입니다. 원본 코드는 위의 wiki에서 확인 가능 합니다.


1.  사용할 Objective-C 코드 작성

(코드 출처 :  http://goo.gl/fNC4c)

#import <Foundation/Foundation.h>
#import <Cordova/CDVPlugin.h>
   
 
// CDVPlugin을 상속
@interface MyClass : CDVPlugin {
      
      // 호출된 Javascript를 참조 하는 ID
      NSString* callbackID; 
 }
 
@property (nonatomic, copy) NSString* callbackID;
 
// Instance Method 
- (void) print:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
  
@end


#import "MyClass.h"
       
 @implementation MyClass
 
 @synthesize callbackID;
 
 -(void)print:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options 
 {
           // arguments에 제일 마지막에 있는 값이 callbackID이다.
           self.callbackID = [arguments pop];
 
           // Javascript로 부터 전달된 값을 저장
           NSString *stringObtainedFromJavascript = [arguments objectAtIndex:0];                
 
           // Javsacript로 확인된 메세지를 보내기 위해 Objective-C에서 값 생성
           NSMutableString *stringToReturn = [NSMutableString stringWithString: @"StringReceived:"];
 
           // 전달된 값과 생성된 값을 합침
           [stringToReturn appendString: stringObtainedFromJavascript];
            
           // Javascript에 전달할 결과 값을 생성 CDVPluginResult 로 생성 해야만 한다. 전달하는 문자열은 UTF-8로 인코딩
           CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK
                  messageAsString: [stringToReturn stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
 
           // Javascript로 부터 전달된 값이 HellowWorld이면 성공 Callback 실행, 실패면 실패 Callback 실행
           if ([stringObtainedFromJavascript isEqualToString:@"HelloWorld"] == YES)
           {
                  // Call the javascript success function
                  [self writeJavascript: [pluginResult toSuccessCallbackString:self.callbackID]];
           else
           {   
                  // Call the javascript error function
                  [self writeJavascript: [pluginResult toErrorCallbackString:self.callbackID]];
           }
  }
  @end


2. 위에서 작성된 Plugin 코드를 실행할 Javascript 클래스 생성 및 실행 예제


var MyPlugin = {
     nativeFunction: function(types, success, fail) {
          return Cordova.exec(success, fail, "MyPlugin""print", types);
     }
};
 
MyPlugin.nativeFunction(
      ["HelloWorld"],
      function(result) {
           alert("Success: \r\n"+result);     
      },
      function(error) {
           alert("Error: \r\n"+error);     
      }
); 



3. 위의 코드들이 제대로 동작하게 할 설정  


Cordova.plist



<plist version="1.0">

     <dict>
          ...
          <key>Plugins</key>
          <dict>
               ...

               <key>MyPlugin</key>

               <string>MyClass</string>
               ...
          </dict>
          ...
     </dict>
</plist>





다른 플랫폼에 대한 Plugin 개발 방법은 여기서(http://goo.gl/O6XHI) 확인 가능 합니다


결론


PhoneGap은 모바일 개발 인력이 부족한 환경에서 빠른 시간 안에 더 많은 플랫폼을 대응할 수 있다는 장점을 가지고 있습니다. 하지만 이러한 생산성은 모든 플랫폼에 적용되는 것이 아닙니다. 지극히 한정적인 서비스에서 그리고 웹기반으로 서비스를 구축했을때 장점을 가진 환경에서만 위의 장점을 누릴수 있습니다. 많은 서비스들이 하이브리드 앱으로 서비스를 시작했다가 결국에는 Native 로 다시 만드는 사례가 많아 지고 있는 이유는, 하이브리드 앱 개발이나 HTML5 라는 용어가 단순히 유행 처럼 서비스에 적용하는 사례들이 많아 지고 있기 때문이 아닐까 생각해 봅니다.


저도 PhoneGap에 대해 공부 하고 있는 상태지만, 서비스에 해당 기술을 도입함에 앞서서 앞으로 만드려고 하는 서비스가 퍼포먼스를 중시하는 서비스 인지, 아니면 특별한 기능이 있는데 이를 하이브리드 앱으로 개발해도 가능 할지에 대해 반드시 확인하고 적용해 보는게 좋습니다. 

제대로된 선행 조사와 서비스에 대한 이해가 있는 상태에서 PhoneGap을 선택했을때는 더할나위 없이 빠른 퍼포먼스를 낼 수도 있는 플랫폼이지만 그게 아니라면 빠른 생산성은 커녕 유지 보수 하는데 더 많은 시간과 인력이 필요하게 될거라 생각 합니다.


PhoneGap의 모든것이라는 제목으로 3개의 포스팅을 하였는데요. 모든것을 다룬것 같진 않네요. 처음 시작하기에 앞서 한번 훑어 보면 좋은 글이라고 봐주셨으면 합니다.


제가 언급한 내용중 잘못된 내용이 있으면 바로 잡아 주세요.


Posted by Flash 동강
Programming2012.05.07 08:30




이번 문서에서는 PhoneGap를 셋팅하고 (iOS) PhoneGap 프로젝트에서 javascript 초기화에 대해 다룬다.


Getting Start PhoneGap



PhoneGap을 시작하는 사람들을 모두 들어가 봤을만한 공식 사이트다. 아주 친절하게도 http://phonegap.com/start 이 주소로 들어 가면 플랫폼 별로 초기 셋팅을 어떻게 하는지에 대해 순서대로 나와 있다. 



주의 해야할 사항은 xcode 를 이용하여 iOS 플랫폼에 셋팅을 하는 경우라면 초기에 PhoneGap을 설치하고 Cordova Project로 생성을 한 뒤에 위와 같은 폴더 구조가 나오는데 바로 컴파일을 하면 제대로된 화면이 안나오고 아래와 같은 메세지를 볼수 있다.



PhoneGap에서 사용되는 javascript 와 html, css파일들은 프로젝트 하위의 www 폴더에 생성되는데 xcode에서 이를 인식하지 못하여 발생하는 문제이다. xcode에 플러그인 형식으로 설치 하는 거라 플러그인에서 생성 시킨 폴더(www)를 자동으로 프로젝트에 추가 해주지 못해서 그런것 같다. 위의 문제는 프로젝트를 한번 컴파일 한뒤에 프로젝트를 저장한 폴더에 이동해 보면 www폴더가 생성되어 있는걸 볼수 있는데 아래와 같이 프로젝트에 추가해 주면 제대로 동작 하게 된다.


www폴더를 드래그 해서 위의 phonegap_sample 프로젝트에 드랍해 주면 프로젝트에서 www를 인식 하게 된다. 





www/index.html 



<script type=
"text/javascript" charset="utf-8" src="cordova-1.5.0.js"></script>
<script type="text/javascript">
 
function onBodyLoad() {
 
    document.addEventListener("deviceready", onDeviceReady, false);
}
 
function onDeviceReady()
{
    // Device Ready!
}
 
  
</script>
<body onload="onBodyLoad()">
</body>


www폴더를 보면 PhoneGap을 동작하는데 필요한 cordova.js와 index.html 이 있다. cordova.js를 PhoneGap을 초기화 하고 디바이스와 통신하는데 필요한 준비 및 API로 구성되어 있다. 한번 훑어 보는것도 좋을듯 하다.


위의 코드는 index.html에서 기본적인 source만 뽑아낸 것이다. 어플리케이션이 실행 되면 처음으로 시작되는 곳이 index.html 이다. 모든 초기화는 여기서 이루어 진다. 일반 웹 페이지와 다른 것은 "deviceready" 이벤트를 통해 PhoneGap이 동작하는 기기(플랫폼)가 준비가 되었는지 확인하는 과정이 필요하다. 위의 코드에서 알수 있듯이 onDeviceReady가 호출 된 후에에 PhoneGap API 등을 사용할 수 있다. 그 전에 호출을 해봤자 실행 되지 않는다.




2개의 문서로 마무리를 지으려고 했는데, 문서를 작성하면서 생각이 덧붙여 지면서 분량이 더 많아 졌다. 다음 문서에서는 iOS와 Android 플랫폼에서 동작하는 Plugin 개발하는 방법을 다루겠다.

 

Posted by Flash 동강
Programming2012.05.02 08:30



PhoneGap

PhoneGap의 기본컨셉은 대부분의 모바일 플랫폼이 WebView를 가지고 있기 때문에 기본적인 기능들은 HTML과 CSS, Javascript로 만들어서 WebView에서 동작하게 하고 Device(Native)의 도움이 필요한 영역은 PhoneGap framework가 도움을 줘서 설치되어 동작하는 어플리케이션을 만들수 있는 방법을 제공 하는 것이다.





Apache Cordova

Adobe가 PhoneGap을 인수한 뒤에 PhoneGap을 Apache재단에 기부하였다. 그래서 Opensource가 되었고, PhoneGap 1.5 (Cordova) 버전부터 클래스 이름이 죄다 바뀌어 버렸다.


PhoneGap에서 제공하는 것들

WebView만으로는 구현이 어렵거나, Native의 도움이 필요한 기본 기능들은 PhoneGap API을 통해 사용 가능하다. 

지원하는 API 는 다음과 같다.

  • 각각의 기능별로 예제 코드와 함께 정리가 잘되어 있어서 쉽게 적응할 수 있다.
  • 각 API별로 지원하는 플랫폼이 명시 되어 있다. (iOS와 Android는 대부분 지원)


Accelerometer : Tap into the device's motion sensor.

Camera : Capture a photo using the device's camera.

Capture : Capture media files using device's media capture applications.

Compass : Obtain the direction that the device is pointing.

Connection : Quickly check the network state, and cellular network information.

Contacts : Work with the devices contact database.

Device : Gather device specific information.

Events : Hook into native events through JavaScript.

File : Hook into native file system through JavaScript.

Geolocation : Make your application location aware.

Media : Record and play back audio files.

Notification : Visual, audible, and tactile device notifications.

Storage : Hook into the devices native storage options.



PhoneGap의 동작 원리

PhoneGap을 이용하여 만든 어플리케이션들도 결국에는 Native 어플리케이션으로 컴파일되어 설치 된다. Adobe AIR과 같이 코드가 바이너리로 설치 파일에 포함되는 형식이 아니라, Native 어플리케이션 위에서 PhoneGap이 동작하고 이 PhoneGap을 통해 Javascript로 만든 어플리케이션과 통신하는 과정을 통해 실행 된다. 하지만 Javascript는 Native와 다른 환경에서(WebView) 동작한다. JavaScript는 네이티브 코드와 데이터를 공유할 수 없다. 그래서 PhoneGap에서는 별도의 통신 방법을 만들어 웹뷰에서 네이티브 코드와 데이터를 교환한다. 각각의 플랫폼(iOS, Android...) 마다 WebView와 Native와 서로 통신하는 방법이 다르다. 이렇게 통신하는 방법이 다르기 때문에 PhoneGap에서 이를 지원한다. 이러한 방법이 PhoneGap이 동작하는 원리이다.

PhoneGap을 Native에서 동작하는 코드들과 (각각 플랫폼 마다 별개) cordova.js 과의 통신을 통해 동작한다. (Plugin이 있다면 Plugin을 제어 하는 코드들도 함께 동작) 

각각의 플랫폼마다 WebView와의 통신 방법이 다르므로 모두 언급할 수 없기에 대표적으로 iOS와 Android를 설명하면 다음과 같다. 더 자세한 내용은 여기를 참고하라.


IOS


Custom Scheme 이란? (예제)

tel:01012341234
kakaolink://sendurl?msg=[message]&url=[url]&appid=[appid]&appver=[appver]
gap://ready



iOS에서는 WebView에서 Native로 명령을 전달하고 받기 위한 방법으로 Custom Scheme를 사용한다. 아래와 같은 형식으로 WebView에서 호출하면 Native에서는 클래스(class), 함수(command) 그리고 함수에 전달될 인자(arguments) 를 통해 Native Code를 실행 한다.


yourscheme://<class>.<command>/[<arguments>][?<dictionary>]


반대로 Native Code에서 WebView로 명령은 iOS SDK의 stringByEvaluatingJavaScriptFromString를 이용한다.



NSString* status = @
"Native To WebView!";
[webView stringByEvaluatingJavaScriptFromString:status];


Android

WebView에 있는 addJavascriptInterface를 통해 Javascript가 호출할 수 있는 코드정보를 미리 등록해서 이를 이용해서 WebView에서 Native코드를 실행한다.

등록


webView.addJavascriptInterface(new MyNativeAPI(), "MyNativeAPI");
Class MyNativeAPI {
 
    public String whereAmI() {
        return "I am in Native";
    }
}


호출


MyNativeAPI.whereAmI();


반대로 Native Code에서 WebView로 명령은 WebView클래스의 loadUrl() 을 이용한다.


webView.loadUrl("javascript:alert('I am in WebView')");


PhoneGap을 사용하면 위에서 언급한 제공하는 API 만으로 어플리케이션을 구현하는데 부족함이 많다. 그래서 PhoneGap에서는 이 부족한 기능을 특정 플랫폼에 맞게 PhoneGap Plugin을 개발하여 사용할수 있다. (Adobe AIR의 Native Extention 이라 생각하면 되겠다) PhoneGap의 근본 취지와는 다르게 Plugin은 특정 플랫폼에 맞춰서 따로 따로 개발해 줘야한다. 2번째 문서에서는 간단히 PhoneGap Plugin을 개발하는 방법에 대해 다룰 것이다.


Posted by Flash 동강
Flash platform2012.03.25 18:47


출처 : http://goo.gl/Je692


얼마 전에 Image Sprite 를 사용했을때의 효과에 대해서 포스팅을 한적이 있는데요. 이제서야 그 두번째 포스팅을 하게 되네요. 

테스트에 사용한 이미지들이 얼마전에 스토어에 오픈한 Pix : Pixel Mixer의 이미지들이라서 이제서야 블로그 포스팅을 할 수 있게 되었습니다. :D  생각 보다 Pix 에 대한 사용자들의 반응이 좋아서, 작업에 참여한 사람들 모두 싱글 벙글 하고 있습니다. 


이 포스팅은 이전에 작성된 Flash App Performance : Image Sprite Sheet 와 이어지는 내용입니다. 아직 이전 포스팅을 안읽으신 분들은 읽고 본 포스팅을 보시는게 좋을것 같습니다.



Image Sprite 로 만들어서 작업하는게 좋다는건 알고 있는데, 얼마나 차이가 발생할까 궁금해서 테스트를 해 봤습니다. 테스트 대상은 모바일이고 OS에 따라 차이가 나겠지만, 이정도 차이라면 확실하게 좋다고 말할 수 있겠네요. 비교는 단순히 Embed 태그를 이용해서 각각의 이미지를 따로 사용했을때와 (Image Embed) 이미지들을 Sprit 해서 하나의 이미지를 사용했을때 (Image Sprite) 경우는 비교 했습니다.


Flash Builder Profiler

Flash Builder Profiler 상에서 나타나는 메모리 점유율

왼쪽 : Image Embed (176K) , 오른쪽 : Image Sprite (68K) , 차이 108K


왼쪽 : Image Embed (5296K) , 오른쪽 : Image Sprite (5178K) , 차이 118K



Adobe AIR Simulator

AIR Simulator 에서 어플리케이션을 실행 시켰을때 나타나는 메모리 점유율

왼쪽 : Image Embed (19886080 Byte) , 오른쪽 : Image Sprite (6754304 Byte) , 차이 13131776 Byte



Device Test (iPhone 4S)

iPhone 4S 에서 어플리케이션을 실행 시켰을때 나타나는 메모리 점유율

왼쪽 : Image Embed (4890624Byte) , 오른쪽 : Image Sprite (2478080 Byte) , 차이 2412544 Byte



메모리를 줄여 준다는게 사용자가 느끼기에는 확연한 차이가 없습니다. 하지만, 모바일이나 적은 리소스만 운영을 할 수 있는 플랫폼에서는 반드시 필요한 작업이라 할 수 있습니다. 프로젝트가 대부분 마무리 되고, 더이상 디자인 수정 사항이 없다고 판단이 될때 적용해 보세요. 



댓글은 언제든지 환영 합니다. :ㅇ


Posted by Flash 동강
Review2012.03.19 11:37



Pix 는 Adobe AIR 를 이용하여 만든 어플리케이션 입니다. 기존에 작성된 Flash Player 용으로 배포된 사진 편집기의 소스(Actionscript3)를 그대로 활용하여 모바일 어플리케이션을 구현하는데 사용하였습니다. 




"하나의 코드로 모든 플랫폼을 커버 할 수 있다." 는게 Adobe가 AIR Mobile 을 설명할때 주로 사용하고 있는 말입니다. Pix 는 이 장점을 최대한 활용하여 하나의 프로젝트에서 한번의 컴파일로 iOS(iPhone, iPad), Android OS용 어플리케이션을 구현 하였습니다. 해상도를 맞추는데 어려움이 있었지만, 비교적 짧은 기간 동안 좋은 퀄러티의 어플리케이션을 만들수 있었습니다. 




지금까지는 이 블로그가 Flash 관련글을 포스팅 하는 곳이라 기술적인 부분에 대해 나열해 보았는데요. 지금부터 Pix에 대해 소개해 보겠습니다.


Pix 의 장점은 쉬운 UI 구성과 다양한 필터효과를 가지고 있다는 점 입니다. 추가로 Facebook, Twitter로 보내기 기능으로 최대한 빠르게 자신의 사진을 공유 할 수 있습니다. 일단 소개 동영상 부터 보시죠.








주요 기능


- 사진을 더 생동감 있게 해주는 30개의 필터와 24개의 레이어 효과 그리고 16개의 액자를 제공 합니다.

- 필터 중복 적용 기능을 사용하여 좀 더 세밀한 느낌을 만들수 있습니다.

- 즐겨 찾기로 추가하여 자신만의 효과를 빠르게 적용할 수 있습니다.

- Twitter, Facebook 공유 기능과 그밖에 스마트폰에 설치 되어 있는 어플리케이션과의 연동 기능을 제공 합니다.



아직 Adobe AIR를 이용한 모바일 어플리케이션 개발을 고민하고 있는 분들이 많은 걸로 알고 있습니다. Pix 를 설치해 보시고 이미 충분히 좋은 플랫폼이다라는걸 느끼셨으면 합니다. Chrome Web Store 에 등록도 준비 하고 있습니다. Chrome Web Store까지 등록이 되면 Flash Platform으로 구현한 제대로된 Hybrid Application이 될거라 생각 합니다.


 

Pix 공식 홍보 페이지 : http://goo.gl/ftnZR

iOS 다운로드 페이지 : http://itunes.apple.com/us/app/pix-pixel-mixer/id509144139

Android 다운로드 페이지 : https://play.google.com/store/apps/details?id=air.net.daum.pix


QR 코드로 다운로드 받기



Adobe AIR 를 이용하여 모바일 어플리케이션을 구현 하면서 어려운 점이나, 버그 같은데 딱히 물어 볼곳이 없다는 느낌을 많이 받았습니다. 댓글이나 메일로 문의 주시면 저희 팀이 아는 내용이라면 빠르게 답변 드리겠습니다.


Posted by Flash 동강