Here is the code:
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
public class Runner{
public static JFrame gui;
public static LinkedList<File> files;
public static int totalFiles;
public static int percentage;
public static void main(String args[]){
gui = new JFrame();
percentage = 0;
totalFiles = 0;
files = new LinkedList<File>();
gui.setTitle("Thumbnail Maker v1.0");
gui.setResizable(false);
gui.setSize(300, 70);
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gui.setVisible(true);
writeLine("Initializing...", 5, 15);
File dir = new File("C:/Users/Jamedon/Pictures/da2/");
getFilesBegin(dir);
makeThumbs();
}
public static void clearScreen(){
clearBox(0, 0, 300, 300);
}
public static void clearBox(int x, int y, int width, int height){
gui.getContentPane().getGraphics().clearRect(x, y, height, width);
}
public static void writeLine(String str, int x, int y){
gui.getContentPane().getGraphics().drawString(str, x, y);
}
public static void makeThumbs(){
for(int i=1; !files.isEmpty(); i++){
String op = files.pop().getAbsolutePath();
clearScreen();
writeLine(op, 5, 15);
writeLine("Percentage completed: "+percentage+"%", 5, 30);
percentage = (int)((((double)i+1)/totalFiles)*100);
try{
scale(op, 100, "G:/Documents/Pictures/thumbnails/thumb_"+i+".jpg");
}
catch (IOException e){
clearScreen();
writeLine("Fatal Error, IO exception.", 5, 15);
return;
}
System.gc();
}
}
public static void scale(String srcFile, int destWidth, String destFile) throws IOException {
BufferedImage src = ImageIO.read(new File(srcFile));
AffineTransform at;
if(src.getWidth() > src.getHeight()){ // scale correctly
at = AffineTransform.getScaleInstance((double)destWidth/src.getWidth(), (double)destWidth/src.getWidth());
}
else{
at = AffineTransform.getScaleInstance((double)destWidth/src.getHeight(), (double)destWidth/src.getHeight());
}
BufferedImage dest = new BufferedImage((int)(at.getScaleX()*src.getWidth()), (int)(at.getScaleY()*src.getHeight()), BufferedImage.TYPE_INT_RGB);
Graphics2D g = dest.createGraphics();
g.drawRenderedImage(src, at);
ImageIO.write(dest, "JPG", new File(destFile));
g.dispose(); // clean up.
dest.flush();
src.flush();
}
public static void getFilesBegin(File dir){
clearScreen();
writeLine("Loading files from "+dir, 5, 15);
writeLine("Percentage completed: "+percentage+"%", 5, 30);
getFiles(dir);
}
public static void getFiles(File dir){
String[] children = dir.list();
if(children == null){
return;
}
for(int i=0; i<children.length; i++){
getFiles(new File(dir.getAbsolutePath()+children[i]));
String filename = children[i];
try{
String ext = filename.split("\\.")[1];
if(isImageExtension(ext)){
files.push(new File(dir.getAbsolutePath()+"\\"+filename));
totalFiles++;
}
}
catch(Exception e){
getFiles(new File(dir.getAbsolutePath()+"\\"+filename+"\\"));
}
}
System.gc();
}
public static boolean isImageExtension(String ext){
return ext.toLowerCase().matches("(png|bmp|jpeg|jpg|gif|tiff)");
}
}
public class LinkedList<E>{
private Node<E> head;
int length;
public LinkedList(){
head = new Node<E>(null, head, head);
head.setPrev(head);
length = 0;
}
public E pop(){
E temp = head.getNext().getItem();
head.getNext().getNext().setPrev(head);
head.setNext(head.getNext().getNext());
length--;
System.gc();
return temp;
}
public void push(E item){
Node<E> newNode = new Node<E>(item, head, head.getPrev());
head.getPrev().setNext(newNode);
head.setPrev(newNode);
length++;
}
public boolean isEmpty(){
return length==0;
}
public String toString(){
String ret = new String("Length: "+length+"\n");
Node<E> cNode = head.getNext();
for(int i=0; cNode!=head; i++, cNode = cNode.getNext()){
ret += "Item: "+i+", contains: "+cNode.getItem()+"\n";
}
return ret;
}
}
The above class is for school. I am have stripped out most of the functions it orignally had to make it easier on the eyes (and act more like a queue).
public class Node<E>{
private E payload;
private Node<E> next;
private Node<E> prev;
public Node(E item, Node<E> n, Node<E> p){
payload = item;
next = n;
prev = p;
}
public E getItem(){
return payload;
}
public void setNext(Node<E> n){
next = n;
}
public void setPrev(Node<E> p){
prev = p;
}
public Node<E> getNext(){
return next;
}
public Node<E> getPrev(){
return prev;
}
}
At this point I am having it go through about 50 images, which it gets to 61% complete, and then I get the following error:
Quote
at java.awt.image.DataBufferByte.<init>(Unknown Source)
at java.awt.image.ComponentSampleModel.createDataBuffer(Unknown Source)
at java.awt.image.Raster.createWritableRaster(Unknown Source)
at javax.imageio.ImageTypeSpecifier.createBufferedImage(Unknown Source)
at javax.imageio.ImageReader.getDestination(Unknown Source)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(Unknown Source)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(Unknown Source)
at javax.imageio.ImageIO.read(Unknown Source)
at javax.imageio.ImageIO.read(Unknown Source)
at Runner.scale(Runner.java:59)
at Runner.makeThumbs(Runner.java:48)
at Runner.main(Runner.java:28)
Just wondering if there is anything obvious that I could do to improve preformance or at least get the program to finish (without limiting the number of images it can have in the linked list at one time).
Any help would be appreciated.

Start a new topic
Add Reply




MultiQuote


| 


