Post date: May 4, 2014 4:21:15 AM
たとえば,イラレやパワポなどの保存形式(pptxファイルなど)は,そのファイルの中に画像を保存している.
これと同じことがやりたくてpimage型の配列とstring型の配列を包含したファイルを保存できるクラスを作ってみた.
import java.nio.ByteBuffer;
class Filemaker {
PImage img[];
String str[];
int index;
void saver(PImage img[], String str[], String name) {
ArrayList<Byte> data=new ArrayList<Byte>();
int2bytes(img.length, data);
for (int i=0;i<img.length;i++) {
pimg2bytes(img[i], data);
}
byte sdata[]=null;
StringBuffer str1=new StringBuffer(str[0]);
for (int i=1;i<str.length;i++) {
str1.append("\n");
str1.append(str[i]);
}
try {
sdata=new String(str1).getBytes("UTF-8");
}
catch(Exception e) {
}
byte adata[]=new byte[data.size()+sdata.length];
int index1=0;
for (int i=0,n=data.size();i<n;i++) {
adata[index1++]=(byte)(data.get(i));
}
for (int i=0;i<sdata.length;i++) {
adata[index1++]=sdata[i];
}
saveBytes(name, adata);
}
void loader(String name) {
byte data[]=loadBytes(name);
index=0;
img=new PImage[bytes2int(data)];
for (int i=0;i<img.length;i++) {
img[i]=bytes2pimg(data);
}
byte sdata[]=new byte[data.length-index];
System.arraycopy(data, index, sdata, 0, sdata.length);
try {
str = new String(sdata, "UTF-8").split("\n");
}
catch(Exception e) {
}
}
void pimg2bytes(PImage img, ArrayList<Byte> data) {
int length=img.pixels.length*4+8;
int2bytes(img.width, data);
int2bytes(img.height, data);
img.loadPixels();
for (int i=0;i<img.pixels.length;i++) {
int2bytes(img.pixels[i], data);
}
}
void int2bytes(int i, ArrayList<Byte> data) {
data.add(new Byte((byte)((i>>24)&0xFF)));
data.add(new Byte((byte)((i>>16)&0xFF)));
data.add(new Byte((byte)((i>>8)&0xFF)));
data.add(new Byte((byte)(i&0xFF)));
}
PImage bytes2pimg(byte data[]) {
int width=bytes2int(data);
int height=bytes2int(data);
PImage img=createImage(width, height, ARGB);
for (int i=0;i<img.pixels.length;i++) {
img.pixels[i]=bytes2int(data);
}
img.updatePixels();
return img;
}
int bytes2int(byte data[]) {
int i=ByteBuffer.wrap(new byte[] {
data[index], data[index+1], data[index+2], data[index+3]
}
).getInt();
index+=4;
return i;
}
int bytes2int(byte a, byte b, byte c, byte d) {
return ((a<<24)+(b<<16)+(c<<8)+d);
}
}
以下のようにして使える.
void setup() {
size(640, 480);
Filemaker fm;
fm.saver(new PImage[] {
loadImage("test.png")
}
, new String[] {
"test", "てすと", "テスト"
}
, "保存したい形式.gutu");
fm.loader("保存したい形式.gutu");
image(fm.img[0], 0, 0);
for (String s:fm.str)println(s);
}