/*
* ImageOutputSynapse.java
*
* Created on 23 October 2005, 19:13
*
* To change this template, choose Tools | Options and locate the template under
* the Source Creation and Management node. Right-click the template and choose
* Open. You can then make changes to the template in the Source Editor.
*/
package org.joone.io;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.TreeSet;
import org.joone.log.*;
import org.joone.net.NetCheck;
/**
* This class collects the output from the connected layer and places it into an image file.
* Images can be produced in GIF, JPG and PNG formats.
*
* Colour Mode
* In colour mode ImageOutputSynapse expects seperate RGB input values in the range 0 to 1 from the
* connected layer. So to produce an image of width 10 and height 10 there must be 10x10x3 inputs
* from the previous layer/s. The red, green and blue components in the final image are set using the
* individual component values from the input.
*
*
* Non Colour Mode / Grey Scale Mode
* In this mode the synapse treats each input value as a grey scale value for each pixel. In this mode
* only Width*Height values are required. To produce the final image the Red, Green and Blue components
* are the set to this same value.
*
* @author Julien Norman
*/
public class ImageOutputSynapse extends StreamOutputSynapse {
/** The object used when logging debug,errors,warnings and info. */
private static final ILogger log = LoggerFactory.getLogger(ImageOutputSynapse.class);
static final long serialVersionUID = 1287752494948170142L;
public final int JPG = 1;
public final int GIF = 2;
public final int PNG = 3;
private String OutputDirectory = System.getProperty("user.dir");
private int ImageFileType = JPG;
private int Width = 10;
private int Height = 10;
private boolean ColourMode = true;
/** Creates a new instance of ImageOutputSynapse */
public ImageOutputSynapse() {
}
/**
* Writes the Neural Network pattern to an Image file, the Image type is specified by
* the ImageFileType property.
*/
public void write(org.joone.engine.Pattern pattern) {
if ( pattern.getCount() != -1) {
String formatName;
switch(getImageFileType()) {
case JPG :
formatName = "jpg";
break;
case GIF :
formatName = "gif";
break;
case PNG :
formatName = "png";
break;
default:
formatName = "jpg";
}
try {
String outDir = getOutputDirectory();
if (!outDir.endsWith(System.getProperty("file.separator")))
outDir += System.getProperty("file.separator");
File theOutFile = new File(outDir+"Image"+pattern.getCount()+"."+formatName);
BufferedImage outImage = patternToImage(pattern);
if ( outImage != null) {
javax.imageio.ImageIO.write(outImage, formatName, theOutFile);
}
} catch(Exception ex) {
log.error("Caught exception when trying to write Image : "+ex.toString());
}
}
}
/**
* Converts the given Neural Network pattern to a BufferedImage.
* @param pat The Neural Network pattern to convert.
* @return The pattern converted to a BufferedImage.
*/
private BufferedImage patternToImage(org.joone.engine.Pattern pat) {
BufferedImage theImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
double [] array = pat.getArray();
int Red = 0,Green= 0,Blue = 0;
int rgb = 0, x=0, y=0, j=0;
if ( ColourMode ) {
if ( array.length == getWidth()*getHeight()*3) {
//for ( y=0;y= getWidth()) {
x=0;
y++;
}
}
} else {
log.error("Pattern Contains "+pat.getCount()+" RGB Values - Image Contains "+(getWidth()*getHeight())+" RGB Values , Size Mismatch.");
}
} else {
if ( array.length == getWidth()*getHeight()) {
for ( j=0;j= getWidth()) {
x=0;
y++;
}
}
} else {
log.error("Pattern Contains "+pat.getCount()+" RGB Values - Image Contains "+(getWidth()*getHeight())+" RGB Values , Size Mismatch.");
}
}
return(theImage);
}
/**
* Gets the directory where Image files will be created.
*/
public String getOutputDirectory() {
return OutputDirectory;
}
/**
* Sets the name of the directory where Image files will be created.
* @param OutputDirectory The directory used to store generated image files.
*/
public void setOutputDirectory(String OutputDirectory) {
this.OutputDirectory = OutputDirectory;
}
/**
* Obtains the image type JPG = 1, GIF = 2, PNG = 3 of the format of the output files.
*/
public int getImageFileType() {
return ImageFileType;
}
/**
* Sets the image type JPG = 1, GIF = 2, PNG = 3 of the format of the generated image files.
* @param ImageFileType JPG = 1, GIF = 2, PNG = 3.
*/
public void setImageFileType(int ImageFileType) {
this.ImageFileType = ImageFileType;
if ( this.ImageFileType < 1)
this.ImageFileType = 1;
if ( this.ImageFileType > 3)
this.ImageFileType = 3;
}
/**
* Gets the desired width of the generated image files.
*/
public int getWidth() {
return Width;
}
/**
* Sets the desired width of the generated image files.
*/
public void setWidth(int Width) {
this.Width = Width;
}
/**
* Gets the desired height of the generated image files.
*/
public int getHeight() {
return Height;
}
/**
* Sets the desired height of the generated image files.
*/
public void setHeight(int Height) {
this.Height = Height;
}
/**
* Determines if this synapse is in colour mode. false if in grey scale mode.
* @return The ColourMode if this synapse.
*/
public boolean getColourMode() {
return ColourMode;
}
/**
* Sets the colour mode of this synapse.
* @param ColourMode true if in colour mode, false if in grey scale mode.
*/
public void setColourMode(boolean ColourMode) {
this.ColourMode = ColourMode;
}
/** Checks and returns any problems found with the settings of this synapse.
* @return A TreeSet of problems or errors found with this synapse.
*/
public TreeSet check() {
TreeSet checks = super.check();
if (ColourMode ) {
if (Width*Height*3 != this.getInputDimension()) {
checks.add(new NetCheck(NetCheck.FATAL, "Image Width["+getWidth()+"]*Height["+getHeight()+"]*3 not equal to number of inputs from connected layer/s ["+this.getInputDimension()+"]." , this));
}
} else {
if (Width*Height != this.getInputDimension()) {
checks.add(new NetCheck(NetCheck.FATAL, "Image Width["+getWidth()+"]*Height["+getHeight()+"] not equal to number of inputs from connected layer/s ["+this.getInputDimension()+"]." , this));
}
}
if ( OutputDirectory.equals("") ) {
checks.add(new NetCheck(NetCheck.FATAL, "No image output directory set." , this));
}
return checks;
}
}
Ads help maintain this website.