/*
* @(#)Main.java 1.0 2011-08-15
*
* Copyright (c) 2011 Werner Randelshofer, Goldau, Switzerland.
* All rights reserved.
*
* You may not use, copy or modify this file, except in compliance with the
* license agreement you entered into with Werner Randelshofer.
* For details see accompanying license terms.
*/
package org.monte.cmykdemo;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.imageio.stream.FileImageInputStream;
import javax.imageio.stream.ImageInputStream;
import javax.swing.ImageIcon;
import javax.swing.SwingWorker;
import javax.swing.TransferHandler;
import org.monte.media.jpeg.CMYKJPEGImageReader;
import org.monte.media.jpeg.CMYKJPEGImageReaderSpi;
/**
* Main.
*
* @author Werner Randelshofer
* @version 1.0 2011-08-15 Created.
*/
public class Main extends javax.swing.JFrame {
private Handler handler;
/**
* Creates new form Main
*/
public Main() {
initComponents();
setSize(400, 300);
String version = Main.class.getPackage().getImplementationVersion();
if (version != null) {
int p = version.indexOf(' ');
setTitle(getTitle() + " " + version.substring(0, p == -1 ? version.length() : p));
}
handler = new Handler();
setTransferHandler(handler);
imageLabel.setTransferHandler(handler);
//imageLabel.setBackground(Color.BLACK);
//imageLabel.setOpaque(true);
infoLabel.setTransferHandler(handler);
scrollPane.setTransferHandler(handler);
scrollPane.getViewport().setTransferHandler(handler);
}
/**
* This method asynchronously loads an image file.
*/
public void setFile(final File file) {
imageLabel.setIcon(null);
imageLabel.setText("Loading image...");
new SwingWorker<BufferedImage, BufferedImage>() {
@Override
protected BufferedImage doInBackground() throws Exception {
// Loads a JPEG image using the Java ImageIO API
// ---------------------------------------------
// The ImageIO API may provide many ImageReaders which
// claim to be able to read the file. We try them all
// out until we succeed.
BufferedImage img = null;
ImageInputStream iis = new FileImageInputStream(file);
try {
CMYKJPEGImageReader r = new CMYKJPEGImageReader(new CMYKJPEGImageReaderSpi());
r.setInput(iis);
img = r.read(0);
} finally {
iis.close();
}
return img;
}
@Override
protected void done() {
// Show the image or apologize in case of failure
// -----------------------------------------------
try {
BufferedImage image = get();
if (image == null) {
imageLabel.setText("Sorry. Couldn't load image.");
infoLabel.setText(null);
} else {
imageLabel.setIcon(new ImageIcon(image));
imageLabel.setText(null);
infoLabel.setText("<html>Image Dimension: "+image.getWidth()+" x "+image.getHeight()
+"<br>Color Model: "+image.getColorModel()
+"<br>has alpha: "+image.getColorModel().hasAlpha()+" is alpha premultiplied:"+image.getColorModel().isAlphaPremultiplied()
);
}
} catch (Exception ex) {
imageLabel.setText("Sorry. Couldn't load image.");
ex.printStackTrace();
}
super.done();
}
}.execute();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
scrollPane = new javax.swing.JScrollPane();
imageLabel = new javax.swing.JLabel();
infoLabel = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("MonteMedia CMYK Demo");
scrollPane.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
imageLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
imageLabel.setText("Drop CMYK image here");
scrollPane.setViewportView(imageLabel);
getContentPane().add(scrollPane, java.awt.BorderLayout.CENTER);
infoLabel.setFont(new java.awt.Font("Dialog", 0, 11)); // NOI18N
getContentPane().add(infoLabel, java.awt.BorderLayout.PAGE_END);
pack();
}// </editor-fold>//GEN-END:initComponents
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Main().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel imageLabel;
private javax.swing.JLabel infoLabel;
private javax.swing.JScrollPane scrollPane;
// End of variables declaration//GEN-END:variables
/**
* Transfer handler for drag and drop functionality.
*/
private class Handler extends TransferHandler {
@Override
public boolean canImport(TransferSupport support) {
return support.isDataFlavorSupported(DataFlavor.javaFileListFlavor);
}
@Override
public boolean importData(TransferSupport support) {
try {
List<File> files = (List<File>) support.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
if (files.size() == 1) {
setFile(files.get(0));
}
return true;
} catch (UnsupportedFlavorException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
return false;
}
}
}