Skip to content
Snippets Groups Projects
Commit 81d1248e authored by brutzman's avatar brutzman
Browse files

restore original source

parent 1bac9849
No related branches found
No related tags found
No related merge requests found
/*
* PixelTextureGenerator.java
* http://web.nps.navy.mil/~brutzman/Savage/Tools/Authoring/PixelTextureGenerator.java
* https://savage.nps.edu/Savage/Tools/Authoring/PixelTextureGenerator.java
* Created on June 10, 2004, 12:24 AM
* Modified on June 17, 2004, 1:46 AM
* Revised 24-26 January 2005, Don Brutzman
* Revised 23 February 2005, Don Brutzman
* Revised 4 January 2006, Don Brutzman
* Revised 3 January 2007, Don Brutzman
* Revised 10 N0vember 2018, Don Brutzman
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
/**
*
* @author Louis Gutierrez
* @author Don Brutzman
* References:
* http://java.sun.com/j2se/1.4.2/docs/api/java/awt/image/PixelGrabber.html
* http://www.geocities.com/marcoschmidt.geo/java-image-file-code-examples.html
*/
public class PixelTextureGenerator extends Frame
{
private Image image;
private File outputFile;
private FileWriter out;
private int height, width;
private String outputFilename;
static String UsageMessage = "usage: java PixelTextureGenerator imageName.ext [outputSceneName.x3d]";
public PixelTextureGenerator(String imageFilename, String pOutputFilename) throws IOException
{
try
{
String name = "";
Toolkit toolkit = Toolkit.getDefaultToolkit();
image = toolkit.getImage(imageFilename);
MediaTracker mediaTracker = new MediaTracker(this);
mediaTracker.addImage(image, 0);
try
{
mediaTracker.waitForID(0); //makes sure image loads
}
catch (InterruptedException ie)
{
System.err.println(ie);
System.exit(1);
}
//string manipulation for output file and header
name = imageFilename.substring(imageFilename.lastIndexOf("\\")+1,imageFilename.lastIndexOf("."));
if (pOutputFilename.length() == 0)
{
outputFilename = name + "PixelTexture.x3d";
}
else outputFilename = pOutputFilename;
// System.out.println ("[outputFilename=" + outputFilename + "]");
System.out.print ("..");
outputFile = new File( outputFilename );
out = new FileWriter( outputFile );
System.out.print (".");
width = image.getWidth (null);
height = image.getHeight(null);
header(outputFilename, imageFilename, width, height);
handlePixels(image, 0, 0, width, height);
footer(width, height);
System.out.println ("created " + outputFile);
}
catch (Exception e)
{
System.err.println(e);
System.exit(1);
}
}
/**
* This method uses pixelGrabber to grab pixels from an image and then each pixel is
* manipulated into a hex string and written to file.
*/
public void handlePixels(Image img, int x, int y, int imageWidth, int imageHeight) throws IOException
{
try
{
out.write(imageWidth + " " + imageHeight + " " + "3 "); //default is 256*256*256 colors
out.write("\n");
int[] pixels = new int[imageWidth * imageHeight]; //array of pixels to grab
PixelGrabber pg = new PixelGrabber(img, x, y, imageWidth, imageHeight, pixels, 0, imageWidth);
try {
pg.grabPixels();
} catch (InterruptedException e) {
System.err.println("[Error] interrupted waiting for pixels!");
return;
}
if ((pg.getStatus() & ImageObserver.ABORT) != 0) {
System.err.println("[Error] image fetch abort or error");
return;
}
//cycles through the array of pixels
// SFImage: Pixels are specified from left to right, bottom to top
// for (int j = 0; j < imageHeight; j++) {
for (int j = imageHeight - 1; j >= 0; j--) {
for (int i = 0; i < imageWidth; i++) {
handleSinglePixel(x+i, y+j, pixels[j * imageWidth + i]);
}
// break long lines of pixels for countability and to help some parsers/editors
out.write("\n");
}
out.flush();
}
catch (Exception e)
{
System.err.println (e);
}
}
/**
* This method translates the integer value passed by pixeGrabber into
* alpha, red, green, and blue. It then converts these integers to a hex
* string.
*/
public void handleSinglePixel(int x, int y, int pixel) throws IOException{
//translates pixel integer
int alpha = (pixel >> 24) & 0xff;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel ) & 0xff;
//converts to hex
hexConverter(red,green, blue);
}
/**
* This method produces a string that represents a 6 digit hex value
* and writes it to file.
*/
public void hexConverter(int r,int g,int b) throws IOException{
String temp = "0x";
temp += hexCase(r/16);
temp += hexCase(r%16);
temp += hexCase(g/16);
temp += hexCase(g%16);
temp += hexCase(b/16);
temp += hexCase(b%16);
//writes hex value to file
out.write(temp + " ");
}
/**
* pThis method simply changes standard form into hex
*/
public char hexCase(int c) {
char out='Z';
switch (c) {
case 0: out = '0'; break;
case 1: out = '1'; break;
case 2: out = '2'; break;
case 3: out = '3'; break;
case 4: out = '4'; break;
case 5: out = '5'; break;
case 6: out = '6'; break;
case 7: out = '7'; break;
case 8: out = '8'; break;
case 9: out = '9'; break;
case 10: out = 'A'; break;
case 11: out = 'B'; break;
case 12: out = 'C'; break;
case 13: out = 'D'; break;
case 14: out = 'E'; break;
case 15: out = 'F'; break;
default: System.out.println("incorrect color value");
}
return out;
}
/**
* This method writes the header information to file
*/
public void header(String outputFileName, String imageFilename, int x, int y) throws IOException{
out.write("<?xml version='1.0' encoding='UTF-8'?>\n");
// final DOCTYPE
out.write("<!DOCTYPE X3D PUBLIC \"ISO//Web3D//DTD X3D 3.1//EN\" \"http://www.web3d.org/specifications/x3d-3.1.dtd\">\n");
out.write("<X3D version='3.1' profile='Interactive'\n");
out.write(" xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='http://www.web3d.org/specifications/x3d-3.0.xsd'>\n");
out.write(" <head>\n");
out.write(" <meta content='" + outputFileName + "' name='title'/>\n");
out.write(" <meta content='" + imageFilename + "' name='image'/>\n");
out.write(" <meta content='Image converted from binary format into an X3D PixelTexture.' name='description'/>\n");
out.write(" <!-- edit default meta tag entries to document this converted scene -->\n");
out.write(" <meta content='*enter name of original author here*' name='creator'/>\n");
out.write(" <meta content='*if manually translating image-to-X3D, enter name of person translating here*' name='translator'/>\n");
out.write(" <meta content='*enter date*' name='created'/>\n");
out.write(" <meta content='*enter date*' name='translated'/>\n");
out.write(" <meta content='*enter date*' name='modified'/>\n");
out.write(" <meta content='*enter version here, if any*' name='version'/>\n");
out.write(" <meta content='*enter reference citation or relative/online url here*' name='reference'/>\n");
out.write(" <meta content='*enter additional url/bibliographic reference information here*' name='reference'/>\n");
out.write(" <meta content='*enter copyright information here* Example: Copyright (c) Web3D Consortium Inc. 2002*' name='rights'/>\n");
out.write(" <meta content='*enter drawing filename/url here*' name='drawing'/>\n");
out.write(" <meta content='*enter image filename/url here*' name='image'/>\n");
out.write(" <meta content='*enter photo filename/url here*' name='photo'/>\n");
out.write(" <meta content='*enter subject keywords here*' name='subject'/>\n");
out.write(" <meta content='*enter permission statements or url here*' name='permissions'/>\n");
out.write(" <meta content='*insert any known warnings, bugs or errors here*' name='warning'/>\n");
out.write(" <meta content='http://*enter online url address for this file here*/" + outputFileName + "' name='identifier'/>\n");
out.write(" <meta content='http://web.nps.navy.mil/~brutzman/Savage/Tools/Authoring/PixelTextureGenerator.java' name='generator'/>\n");
out.write(" <meta content='http://java.sun.com/j2se/1.4.2/docs/api/java/awt/image/PixelGrabber.html' name='reference'/>\n");
out.write(" <meta content='http://www.web3d.org/x3d/specifications/ISO-IEC-19775-IS-X3DAbstractSpecification/Part01/fieldsDef.html#SFImage' name='reference'/>\n");
out.write(" <meta content='http://www.web3d.org/x3d/specifications/ISO-IEC-19775-IS-X3DAbstractSpecification/Part01/components/texturing.html#Texturecoordinates' name='reference'/>\n");
out.write(" <meta content='http://www.web3d.org/x3d/specifications/ISO-IEC-19775-IS-X3DAbstractSpecification/Part01/components/texturing.html#PixelTexture' name='reference'/>\n");
out.write(" <meta content='http://www.web3d.org/x3d/content/examples/Vrml2.0Sourcebook/Chapter17-Textures/_pages/page13.html' name='reference'/>\n");
out.write(" </head>\n");
out.write(" <Scene>\n");
out.write(" <Viewpoint position='0 0 1.5' description='PixelTexture version of image " + imageFilename + "'/>\n");
out.write(" <!-- Apply the possibly non-square image to square geometry, then scale geometry to match original image aspect ratio -->\n");
out.write(" <Transform translation='-0.5 " + (-0.5 * ((float)y / (float)x)) + " 0' " +
"scale='1 " + ((float)y / (float)x) + " 1'>\n");
out.write(" <Anchor url='" + imageFilename + "' description='Click to view original image " + imageFilename + "' parameter='target=_blank'>\n");
out.write(" <Shape>\n");
out.write(" <!-- double-sided texture since solid='false' -->\n");
out.write(" <IndexedFaceSet coordIndex='0 1 2 3' ccw='true' solid='false'>\n");
out.write(" <Coordinate point='0 0 0, 1 0 0, 1 1 0, 0 1 0'/>\n");
out.write(" </IndexedFaceSet>\n");
out.write(" <Appearance>\n");
out.write(" <Material diffuseColor='0.7 0.7 0.7'/>\n");
out.write(" <PixelTexture image='");
out.flush();
}
/**
* public void footer(int x, int y) throws IOException
* This method writes the footer information to file
*/
public void footer(int x, int y) throws IOException{
out.write("'/>\n");
out.write(" </Appearance>\n");
out.write(" </Shape>\n");
out.write(" </Anchor>\n");
out.write(" </Transform>\n");
out.write(" </Scene>\n");
out.write("</X3D>\n");
out.flush();
}
/**
* public void closeFile() throws IOException
* This method closes the output file
*/
public void closeFile() throws IOException{
out.flush();
out.close();
System.exit(0);
}
public static void main(String[] args) throws IOException
{
if ((args!= null) && (args.length == 1))
{
PixelTextureGenerator gen = new PixelTextureGenerator(args[0], new String(""));
}
else if ((args!= null) && (args.length == 2))
{
PixelTextureGenerator gen = new PixelTextureGenerator(args[0], args[1]);
}
else
{
System.out.println (UsageMessage);
System.exit (-1);
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment