/*
Converts gifs und jpgs to PixelTexture Format (VRML)
Konvertiert gifs und jpgs ins PixelTexture Format (VRML)
# Image-to-PixelTexture Version 1.0.1
# Created by Roland Praehofer rp@memeticdesign.de
# Created on: August,27th Last Modified on: September,11th 11:42
# URL:http://www.memeticdesign.de/rp/image2vrml/image2vrml_java.html
*/
import java.io.*;
import java.awt.*;
import java.awt.Toolkit;
import java.awt.image.*;
import java.net.*;
import java.net.MalformedURLException;
public class Image2vrml extends Frame implements Runnable{
Toolkit tk;
MediaTracker mtrack;
Image img;
final int GRAY = 1;
final int GRAY_WITH_ALPHA = 2;
final int RGB = 3;
final int RGB_WITH_ALPHA = 4;
String theFile;
String theDir;
Thread runMe;
public static void main(String[] args)
{
Image2vrml i2v = new Image2vrml();
}
public Image2vrml()
{
setLayout(null);
String thePath = askForFilePath();
if (thePath == "") System.exit(0);
getImageFromFile(thePath);
setSize(img.getWidth(this),img.getHeight(this));
setVisible(true);
String vrml = img2pix(img);
saveVrmlFile(vrml);
System.exit(0);
}
public void run()
{
try{
mtrack.waitForID(0);
}catch(Exception e){ }
repaint();
}
public String askForFilePath()
{
FileDialog fd = new FileDialog(this,"Choose an gif or jpg image !");
fd.setMode(FileDialog.LOAD);
fd.setVisible(true);
theFile = fd.getFile();
theDir = fd.getDirectory();
if(theDir != null && theDir.length() != 0 && theFile != null && theFile.length() != 0){
return (theDir+theFile);
}else{
return "";
}
}
public void getImageFromFile(String path)
{
tk=Toolkit.getDefaultToolkit();
img = tk.getImage(path);
mtrack = new MediaTracker(this);
mtrack.addImage(img,0);
runMe = new Thread(this);
runMe.start();
while(!mtrack.checkAll()){
try{
runMe.sleep(1000);
}catch(Exception e){}
}
runMe.stop();
return ;
}
public void paint(Graphics g)
{
g.drawImage(img,0,0,this);
}
public String img2pix(Image img2convert){
int width = img2convert.getWidth(this);
int height = img2convert.getHeight(this);
PixelGrabber pg = new PixelGrabber(img, 0, 0, width, height, true);
try
{
boolean worked = pg.grabPixels();
if(!worked)
{
System.out.println("Pixels couldn't be grabbed !");
}
}catch(InterruptedException e){}
int[] pixels = (int[]) pg.getPixels();
// Java counts from upper left pixel, VRML from lower left pixel,
// so we have to do a conversion
int currentRow = height;
int firstOfRow = 0;
int index = 0;
ColorModel cm = pg.getColorModel();
int nrOfPixels = width*height;
String red[] = new String [nrOfPixels];
String green[] = new String [nrOfPixels];
String blue[] = new String [nrOfPixels];
String alpha[] = new String [nrOfPixels];
int r,g,b,a;
boolean graytest = true;
boolean alphatest = false;
int count = 0;
for(int h=height;h>0;h--){
currentRow -= 1; // 'index' of current line
firstOfRow = currentRow * width; //index of first pixel of current row
for(int w=0;w<width;w++){ // start with the last line of pixels
index = firstOfRow + w; // index for pixels[]
r = cm.getRed(pixels[index]);
g = cm.getGreen(pixels[index]);
b = cm.getBlue(pixels[index]);
a = cm.getAlpha(pixels[index]);
// if at least one pixel has different rgb values, it cannot be grayscale
if((r!= g) ||(g != b)||(r!= b)) graytest = false;
if(a != 255) alphatest = true;
alpha[count] = Integer.toHexString(a);
red[count] = Integer.toHexString(r);
green[count] = Integer.toHexString(g);
blue[count] = Integer.toHexString(b);
if(alpha[count].length() == 1) alpha[count] = "0"+alpha[count];
if(red[count].length() == 1) red[count] = "0"+red[count];
if(green[count].length() == 1) green[count] = "0"+green[count];
if(blue[count].length() == 1) blue[count] = "0"+blue[count];
count++;
}
}
// assemble the values for the different modes
StringBuffer pixData = new StringBuffer();
int mode = RGB;
// grayscale
if(graytest && !alphatest) {
mode = GRAY;
for(int i=0;i<nrOfPixels;i++){
pixData.append("0x"+red[i]+"\n");
}
}
// grayscale with alpha
if(graytest && alphatest) {
mode = GRAY_WITH_ALPHA;
for(int i=0;i<nrOfPixels;i++){
pixData.append("0x"+red[i]+alpha[i]+"\n");
}
}
// rgb
if(!graytest && !alphatest) {
mode = RGB;
for(int i=0;i<nrOfPixels;i++){
pixData.append("0x"+red[i]+green[i]+blue[i]+"\n");
}
}
// rgb with alpha
if(!graytest && alphatest) {
mode = RGB_WITH_ALPHA;
for(int i=0;i<nrOfPixels;i++){
pixData.append("0x"+red[i]+green[i]+blue[i]+alpha[i]+"\n");
}
}
StringBuffer vrml = new StringBuffer();
vrml.append("#VRML V2.0 utf8\n");
vrml.append("Transform{ scale "+(float) width/100+" "+(float) height/100 +" 1 children[\nShape{geometry IndexedFaceSet{creaseAngle 3.14 coord Coordinate{ point[-.5 -.5 0,.5 -.5 0,.5 .5 0,-.5 .5 0, ] } coordIndex[0 1 2 -1, 2 3 0 -1] } \nappearance Appearance{material Material{diffuseColor 1 1 1}texture ");
vrml.append("\nPixelTexture{image "+width+" "+height+" "+mode+"\n"+pixData+"}");
vrml.append("\n}}]}");
return vrml.toString();
}
public void saveVrmlFile(String vstring)
{
try{
File outFile = new File(theDir,(theFile+".wrl"));
FileWriter fw = new FileWriter(outFile);
PrintWriter pw = new PrintWriter(fw);
pw.print(vstring);
pw.flush();
pw.close();
}catch(IOException e){
System.out.println("Save Error !");
}
}
}