Flash Bitmap 이미지를 PNG로 저장하기

Flash에서 Bitmap 이미지 – 사용자와 상호작용을 통해 만들어진 이미지 -를 생성한 후 이것을 JPEG 또는 PNG로 저장하여 보관해야할 경우가 있다.

물론 ActionScript 3.0이 지원되는 Flash CS로 모두 개발하면 쉽게 변환이 가능하지만, 아직까지 ActionScript 2.0을 사용하는 경우가 많다.

여기에서는 Flash 8과 Java 1.4.x 를 사용하여 Flash Bitmap 이미지를 저장하는 방법에 대하여 알아본다.

단계로 보면 다음과 같다.
1. Flash: Flash Bitmap을 Windows BMP로 변환한다.
2. Flash: 변환된 Windows BMP를 서버로 데이터를 전송한다.
3. Java: 수신한 데이터를 BMP파일로 저장한 후 PNG 파일로 변환한다.
4. Java: 변환된 PNG 파일경로를 Flash로 리턴한다.
5. Flash: 서버에서 전달된 PNG 파일 경로를 사용하여 이미지를 출력한다.

Flash ActionScript

Flash Bitmap 이미지를 Windows BMP(확장자 .bmp) 파일로 변환하는 것은 BitmapDataExporter라는 ActionScript 2.0용 클래스를 사용하여 가능하다.
이것은 아래 자료에서 볼 수 있다.

sample.as

import flash.display.BitmapData;
import flash.net.FileReference;
import net.webbymx.files.binary.BitmapDataExporter;

var bmp:BitmapData = null;
var bmpExport:BitmapDataExporter = null;
var bmpData:String = null;
var resultFile:TextField;

function exportBitmap(Void):Void {
  bmpData = new String();
  bmpExport = new BitmapDataExporter(bmp);
  bmpExport.export();
}

bmpExport.onProgress = function(b:String, progress:Number):Void {
  bmpData +=b;
}

bmpExport.onExportDone = function(Void):Void {
  sendDataToServer(bmpData);
}

function sendDataToServer(s:String):Void {
  var rlv:LoadVars = new LoadVars();
  rlv.onLoad = function(success:Boolean): Void {
    if(success) {
       resultFile.text = rlv.fileName;
    } else {
       resultFile.text = "Error while connecting to server...";
    }
  };
  var lv:LoadVars = new LoadVars();
  lv.bitmap = s;
  lv.sendAndLoad("http://localhost/upload.do", rlv, "POST");
}

Java Class

Java 1.4.x에서 Windows BMP파일을 저장하는 방법은 여러가지가 있을 수 있다.
여기에서는 먼저 JAI Tool을 사용하여 BMP를 읽을 수 있는 지 확인한 후, 안된다면 Image4J를 사용하도록 하였다.

JAI Image I/O Tool을 사용하면 성능이 더 좋겠지만 프로젝트를 하다보면 JDK 설치 권한이 없거나, 여러 프로젝트를 운영하는 운용업체에서 곤란하다고 하는 경우가 종종있다.

어플리케이션 배포 당시에는 JAI Image I/O Tool이 설치되지 않았을 경우 Image4J를 사용하여 동작하고 운영중에 JAI Image I/O Tool이 설치되었다면 성능을 위해서라도 JAI를 사용하도록 하기 위함이다.

import java.io.FileOutputStream;
import java.io.File;
import java.io.BufferedInputStream;
import java.util.Iterator;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import net.sf.image4j.codec.bmp.BMPDecoder;

private boolean savePngFile(String filePath, String bitmap) {
  try {
    File file = new File(filePath);
    FileOutputStream ostream = new FileOutputStream(file);
    byte[] b = hex2byte(bitmap);
    if(b == null) {
      return false;
    }
    ostream.write(b);
    ostream.close();

    BufferedImage bImage = null;
    Iterator iter =
      ImageIO.getImageReadersByMIMEType("image/bmp");
    if(iter.hasNext()) {
      // using JAI
      bImage = ImageIO.read(file);
    } else {
      // using Image4J
      bImage = BMPDecoder.read(file);
    }
    if(bImage == null) {
      return false;
    }
    ImageIO.write(bImage, "png", file);
  } catch (Exception ex) {
    ex.printStackTrace();
    return false;
  }
  return true;
}

private static byte[] hex2byte(String s){
  if(s == null) return null;
  int l = s.length();
  if(l%2 == 1) return null;
  byte[] b = new byte[l/2];
  for(int i = 0 ; i < l/2 ;i++) {
    b[i] = (byte)Integer.parseInt(s.substring(i*2,i*2+2),16);
  }
  return b;
}

자료