/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * ImageAnotator.java * * Created on 13. Januar 2005, 10:07 */ package Sirius.util.image; import java.awt.*; //import java.net.MalformedURLException; import java.awt.image.BufferedImage; import java.io.*; import java.net.URL; import java.util.*; import javax.imageio.*; import javax.imageio.stream.*; //import com.sun.media.jai.codec.*; /** * DOCUMENT ME! * * @author schlob * @version $Revision$, $Date$ */ public class ImageAnnotator { //~ Static fields/initializers --------------------------------------------- static int LINES = 3; //~ Instance fields -------------------------------------------------------- BufferedImage image = null; BufferedImage watermark = null; int width = 0; int height = 0; int newHeight = 0; int newWidth = 0; String text = ""; float ratio = 1.05f; java.awt.Color textColor = new Color(14, 68, 122); java.awt.Color backGroundColor = new java.awt.Color(148, 190, 232); String filename = ""; boolean printFilename = true; private final transient org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(this.getClass()); //~ Constructors ----------------------------------------------------------- /** * Creates a new instance of ImageAnotator. * * @param filename DOCUMENT ME! * @param watermarkFilename DOCUMENT ME! * * @throws java.io.IOException DOCUMENT ME! */ public ImageAnnotator(final String filename, final String watermarkFilename) throws java.io.IOException { this.filename = filename; image = loadImage(filename); this.width = image.getWidth(); this.height = image.getHeight(); watermark = loadImage(watermarkFilename); } /** * Creates a new ImageAnnotator object. * * @param filename DOCUMENT ME! * @param watermarkFilename DOCUMENT ME! * @param text DOCUMENT ME! * * @throws java.io.IOException DOCUMENT ME! */ public ImageAnnotator(final String filename, final String watermarkFilename, final String text) throws java.io.IOException { this(filename, watermarkFilename); this.text = text; } /** * Creates a new ImageAnnotator object. * * @param file DOCUMENT ME! * @param watermark DOCUMENT ME! * @param text DOCUMENT ME! * * @throws java.io.IOException DOCUMENT ME! */ public ImageAnnotator(final URL file, final URL watermark, final String text) throws java.io.IOException { this.filename = filename; image = loadImage(file); this.width = image.getWidth(); this.height = image.getHeight(); try { this.watermark = loadImage(watermark); } catch (Exception e) { e.printStackTrace(); } this.text = text; } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @param filename DOCUMENT ME! * * @return DOCUMENT ME! * * @throws java.io.IOException DOCUMENT ME! */ protected BufferedImage loadImage(final String filename) throws java.io.IOException { String type = extractImageType(filename); if (type.length() == 0) { type = "TIF"; } // load final File f = new File(filename); if (logger.isDebugEnabled()) { logger.debug("Info : file :" + filename + " file " + f); } final Iterator readers = ImageIO.getImageReadersByFormatName(type); final ImageReader reader = (ImageReader)readers.next(); final ImageInputStream iis = ImageIO.createImageInputStream(f); reader.setInput(iis, false); final int imageIndex = 0; // width = reader.getWidth(imageIndex); // height = reader.getHeight(imageIndex); return reader.read(imageIndex); } /** * DOCUMENT ME! * * @param imgUrl DOCUMENT ME! * * @return DOCUMENT ME! * * @throws java.io.IOException DOCUMENT ME! */ protected BufferedImage loadImage(final URL imgUrl) throws java.io.IOException { String type = extractImageType(imgUrl.getFile()); if (type.length() == 0) { type = "TIF"; } // retrieve appropriate imagereader final Iterator readers = ImageIO.getImageReadersByFormatName(type); final ImageReader reader = (ImageReader)readers.next(); if (logger.isDebugEnabled()) { logger.debug(imgUrl); } final ImageInputStream iis = ImageIO.createImageInputStream(imgUrl.openStream()); reader.setInput(iis, false); final int imageIndex = 0; // width = reader.getWidth(imageIndex); // height = reader.getHeight(imageIndex); return reader.read(imageIndex); } /** * Getter for property text. * * @return Value of property text. */ public java.lang.String getText() { return text; } /** * Setter for property text. * * @param text New value of property text. */ public void setText(final java.lang.String text) { this.text = text; } /** * DOCUMENT ME! * * @param text DOCUMENT ME! */ public void addText(final java.lang.String text) { this.text += text; } /** * Getter for property ratio. * * @return Value of property ratio. */ public float getRatio() { return ratio; } /** * Setter for property ratio. * * @param ratio New value of property ratio. */ public void setRatio(final float ratio) { this.ratio = ratio; } /** * Getter for property textColor. * * @return Value of property textColor. */ public java.awt.Color getTextColor() { return textColor; } /** * Setter for property textColor. * * @param textColor New value of property textColor. */ public void setTextColor(final java.awt.Color textColor) { this.textColor = textColor; } /** * Getter for property backGroundColor. * * @return Value of property backGroundColor. */ public java.awt.Color getBackGroundColor() { return backGroundColor; } /** * Setter for property backGroundColor. * * @param backGroundColor New value of property backGroundColor. */ public void setBackGroundColor(final java.awt.Color backGroundColor) { this.backGroundColor = backGroundColor; } /** * Getter for property image. * * @return Value of property image. */ public java.awt.image.BufferedImage getImage() { return image; } /** * Setter for property image. * * @param image New value of property image. */ public void setImage(final java.awt.image.BufferedImage image) { this.image = image; } /** * Getter for property watermark. * * @return Value of property watermark. */ public java.awt.image.BufferedImage getWatermark() { return watermark; } /** * Setter for property watermark. * * @param watermark New value of property watermark. */ public void setWatermark(final java.awt.image.BufferedImage watermark) { this.watermark = watermark; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public BufferedImage getAnnotatedImage() { newHeight = (int)(height * ratio); newWidth = width; // evtl ver\u00E4ndern aber heapspace final BufferedImage bi = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB); final Graphics g = bi.getGraphics(); // Wuppercolor (Hintergrund) g.setColor(backGroundColor); // f\u00FClle mit Hintergrundfarbe g.fillRect(0, 0, newWidth, newHeight); if (watermark != null) { // wasserzeichen g.drawImage( watermark, newWidth - (watermark.getWidth() + 5), newHeight - (watermark.getHeight() + 5), null); } // bild zeichnen g.drawImage(image, 0, 0, null); // grenzt ein bischen besser ab g.setColor(Color.black); g.drawLine(0, height, width, height); if (text.length() > 0) { drawText(g); } g.setColor(Color.white); final Font f = new Font(g.getFont().getName(), Font.ITALIC, g.getFont().getSize()); g.setFont(f); if (printFilename) { g.drawString("Bilddatei{" + filename + "}", 10, newHeight - 10); } return bi; } /** * DOCUMENT ME! * * @param g DOCUMENT ME! */ protected void drawText(final Graphics g) { // Alle absoluten Zahlen sind heuristiken g.setColor(textColor); final int fontSize = (newHeight - height) / LINES; // mx 3 zeilen final Font f = new Font("COURIER", Font.BOLD, fontSize); g.setFont(f); int stringPos = height + fontSize - 4; int from = 0; int to = 0; final FontMetrics fm = g.getFontMetrics(); final int stringWidth = fm.stringWidth(text); // breite pro character (bei courier) ansonsten im Mittel !!!!!!!!!!! vorsicht final double ppc = (stringWidth / text.length()); if (logger.isDebugEnabled()) { logger.debug("breite pro character" + ppc + " text " + text.length()); } // Anzahl der zeichen einer Zeile final int block = (int)(width / ppc) - 2; // 2 zeichen rand // anzahl der Bl\u00F6cke final int count = (text.length() / block) + 1; // Blockweise Schreiben for (int i = 0; i < count; i++) { if ((to + block) > text.length()) { to = text.length(); } else { to += block; } if (logger.isDebugEnabled()) { logger.debug(from + " " + to + " BLOCK." + block); } String drawString = text.substring(from, to); final int space = drawString.lastIndexOf(" "); if ((space != (drawString.length() - 1)) && (drawString.length() == block)) { to = space + 1; drawString = drawString.substring(0, to); } g.drawString(drawString, (int)ppc, stringPos); stringPos += fontSize - 2; from = to; } } /** * DOCUMENT ME! * * @param im DOCUMENT ME! * @param filename DOCUMENT ME! * * @throws IOException DOCUMENT ME! */ public void saveImage(final BufferedImage im, final String filename) throws IOException { String type = extractImageType(filename); if (type.length() == 0) { type = "TIF"; } final Iterator writers = ImageIO.getImageWritersByFormatName(type); final ImageWriter writer = (ImageWriter)writers.next(); final File f = new File(filename); final ImageOutputStream ios = ImageIO.createImageOutputStream(f); writer.setOutput(ios); writer.write(im); } /** * public void writeImage(BufferedImage im,Object output, String type) throws java.io.IOException { if(type == null * || type.length()==0) type="TIF"; Iterator writers = ImageIO.getImageWritersByFormatName(type); ImageWriter writer * = (ImageWriter)writers.next(); ImageOutputStream ios = ImageIO.createImageOutputStream(output); * //writer.setOutput(ios); writer.write(im); }. * * @param filename DOCUMENT ME! * * @return DOCUMENT ME! */ private String extractImageType(final String filename) { String type = ""; final int endingIndex = filename.lastIndexOf("."); ; if (endingIndex > 0) { type = filename.substring(endingIndex + 1, filename.length()); } return type; } /** * Getter for property printFilename. * * @return Value of property printFilename. */ public boolean isPrintFilename() { return printFilename; } /** * Setter for property printFilename. * * @param printFilename New value of property printFilename. */ public void setPrintFilename(final boolean printFilename) { this.printFilename = printFilename; } // public BufferedImage scale(BufferedImage im, double sx, double sy) // { // // im.createGraphics().scale(sx, sy); // // return im; // // // } /** * DOCUMENT ME! * * @param args the command line arguments * * @throws Exception DOCUMENT ME! */ public static void main(final String[] args) throws Exception { final String txt = "Freie Verwendung f\u00FCr den internen Dienstgebrauch, Publikation oder Weitergabe nur mit Einzelgenehmigung von R102 oder gem\u00E4\u00DF Rahmenvereinbarung mit R102"; final URL imgUrl = new URL("http", "localhost:8084/wm/images/", "wupp1"); final URL wUrl = new URL("http", "localhost:8084/wm/images/", "wupperwurm.gif"); // ImageAnnotator t = new ImageAnnotator("c:\\1.tif","c:\\wupperwurm.gif",txt); final ImageAnnotator t = new ImageAnnotator(imgUrl, wUrl, txt); // String txt = "Freie Verwendung f\u00FCr den internen Dienstgebrauch. Publikation oder Weitergabe // gem\u00E4\u00DF Rahmenvereinbarung mit R102 oder Einzelgenehmigung."; t.saveImage(t.getAnnotatedImage(), "c:\\3.tif"); System.out.println("done"); } }