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;
}









