Adding a date stamp to your digital pictures
You can call me old-fashioned, but i prefer holding a photo album in my hands (the same goes for the books). Sure, it feels bulky and may require more energy spent to page through it, but it just feels right. Especially now with the new baby in town we take quite a lot of pictures and send them to the proud grandparents and other selected family members. How do we do it - copy the pictures to a disk-on-key, drop it at the nearest photoshop and pick up the printed pictures an hour later. The only problem is that neither our camera (one of this Pentax line, not that photoshop can add a timestamp in the bottom-right (or any for that matter) corner of the picture.
This may be fine for now, but when i look through older pictures of me and my family, it's nice to know when the pictures were taken. Of course, i could look for another photoshop, but then i can do it myself. So, without further ado, here is how you can add a date stamp in the bottom-right corner and have it not cut-off when your 4:3 file is printed on a 3:2 paper:
<font color="#ffffff"> </font><font color="#7f0055"><b>public static </b></font><font color="#7f0055"><b>void </b></font><font color="#000000">addDate</font><font color="#000000">(</font><font color="#000000">File inputFile</font><font color="#000000">) </font><font color="#7f0055"><b>throws </b></font><font color="#000000">Exception </font><font color="#000000">{</font><br />
<font color="#ffffff"> </font><font color="#000000">String inputFilename = inputFile.getPath</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">System.out.println</font><font color="#000000">(</font><font color="#2a00ff">"Starting with '" </font><font color="#000000">+ inputFilename + </font><font color="#2a00ff">"'"</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">BufferedImage input = ImageIO.read</font><font color="#000000">(</font><font color="#000000">inputFile</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">Graphics2D graphics = </font><font color="#000000">(</font><font color="#000000">Graphics2D</font><font color="#000000">) </font><font color="#000000">input.createGraphics</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">Date lastModified = </font><font color="#7f0055"><b>new </b></font><font color="#000000">Date</font><font color="#000000">(</font><font color="#000000">inputFile.lastModified</font><font color="#000000">())</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">SimpleDateFormat sdf = </font><font color="#7f0055"><b>new </b></font><font color="#000000">SimpleDateFormat</font><font color="#000000">(</font><font color="#2a00ff">"dd/MM/yyyy"</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">String dateStamp = sdf.format</font><font color="#000000">(</font><font color="#000000">lastModified</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#7f0055"><b>int </b></font><font color="#000000">fontSize = </font><font color="#000000">(</font><font color="#7f0055"><b>int</b></font><font color="#000000">) (</font><font color="#990000">0.4 </font><font color="#000000">* input.getHeight</font><font color="#000000">() </font><font color="#000000">/ </font><font color="#990000">10.0</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">Font font = </font><font color="#7f0055"><b>new </b></font><font color="#000000">Font</font><font color="#000000">(</font><font color="#2a00ff">"Arial"</font><font color="#000000">, Font.BOLD, fontSize</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">graphics.setFont</font><font color="#000000">(</font><font color="#000000">font</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#7f0055"><b>int </b></font><font color="#000000">height = graphics.getFontMetrics</font><font color="#000000">()</font><font color="#000000">.getHeight</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#7f0055"><b>int </b></font><font color="#000000">width = graphics.getFontMetrics</font><font color="#000000">()</font><font color="#000000">.stringWidth</font><font color="#000000">(</font><font color="#000000">dateStamp</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff"> </font><font color="#000000">BufferedImage dateImage = </font><font color="#7f0055"><b>new </b></font><font color="#000000">BufferedImage</font><font color="#000000">(</font><font color="#990000">2 </font><font color="#000000">* fontSize + width, </font><font color="#990000">2</font><br />
<font color="#ffffff"> </font><font color="#000000">* fontSize + height, BufferedImage.TYPE_INT_ARGB</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">Graphics2D dateGraphics = </font><font color="#000000">(</font><font color="#000000">Graphics2D</font><font color="#000000">) </font><font color="#000000">dateImage.getGraphics</font><font color="#000000">()</font><font color="#000000">.create</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">dateGraphics.setColor</font><font color="#000000">(</font><font color="#7f0055"><b>new </b></font><font color="#000000">Color</font><font color="#000000">(</font><font color="#990000">0</font><font color="#000000">, </font><font color="#990000">0</font><font color="#000000">, </font><font color="#990000">0</font><font color="#000000">, </font><font color="#990000">0</font><font color="#000000">))</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">dateGraphics.setComposite</font><font color="#000000">(</font><font color="#000000">AlphaComposite.Src</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">dateGraphics.fillRect</font><font color="#000000">(</font><font color="#990000">0</font><font color="#000000">, </font><font color="#990000">0</font><font color="#000000">, width, height</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff"> </font><font color="#000000">dateGraphics.setComposite</font><font color="#000000">(</font><font color="#000000">AlphaComposite.SrcOver</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">dateGraphics.setFont</font><font color="#000000">(</font><font color="#000000">font</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">dateGraphics.setColor</font><font color="#000000">(</font><font color="#000000">Color.black</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">dateGraphics.setRenderingHint</font><font color="#000000">(</font><font color="#000000">RenderingHints.KEY_ANTIALIASING,</font><br />
<font color="#ffffff"> </font><font color="#000000">RenderingHints.VALUE_ANTIALIAS_ON</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">GlyphVector gv = font.createGlyphVector</font><font color="#000000">(</font><font color="#000000">dateGraphics</font><br />
<font color="#ffffff"> </font><font color="#000000">.getFontRenderContext</font><font color="#000000">()</font><font color="#000000">, dateStamp</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#3f7f5f">// dateGraphics.drawString(dateStamp, fontSize, fontSize);</font><br />
<font color="#ffffff"> </font><font color="#000000">dateGraphics.translate</font><font color="#000000">(</font><font color="#000000">fontSize, </font><font color="#990000">2 </font><font color="#000000">* fontSize</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#7f0055"><b>for </b></font><font color="#000000">(</font><font color="#7f0055"><b>int </b></font><font color="#000000">i = </font><font color="#990000">0</font><font color="#000000">; i < gv.getNumGlyphs</font><font color="#000000">()</font><font color="#000000">; i++</font><font color="#000000">) {</font><br />
<font color="#ffffff"> </font><font color="#000000">Shape glyph = gv.getGlyphOutline</font><font color="#000000">(</font><font color="#000000">i</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">dateGraphics.setStroke</font><font color="#000000">(</font><font color="#7f0055"><b>new </b></font><font color="#000000">BasicStroke</font><font color="#000000">(</font><font color="#000000">fontSize / </font><font color="#990000">10</font><font color="#000000">))</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">dateGraphics.draw</font><font color="#000000">(</font><font color="#000000">glyph</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">}</font><br />
<font color="#ffffff"> </font><font color="#7f0055"><b>float</b></font><font color="#000000">[] </font><font color="#000000">kernel = </font><font color="#7f0055"><b>new </b></font><font color="#7f0055"><b>float</b></font><font color="#000000">[</font><font color="#990000">25</font><font color="#000000">]</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#7f0055"><b>for </b></font><font color="#000000">(</font><font color="#7f0055"><b>int </b></font><font color="#000000">i = </font><font color="#990000">0</font><font color="#000000">; i < kernel.length; i++</font><font color="#000000">)</font><br />
<font color="#ffffff"> </font><font color="#000000">kernel</font><font color="#000000">[</font><font color="#000000">i</font><font color="#000000">] </font><font color="#000000">= </font><font color="#990000">1.0f </font><font color="#000000">/ kernel.length;</font><br />
<font color="#ffffff"> </font><font color="#000000">ConvolveOp cOp = </font><font color="#7f0055"><b>new </b></font><font color="#000000">ConvolveOp</font><font color="#000000">(</font><font color="#7f0055"><b>new </b></font><font color="#000000">Kernel</font><font color="#000000">(</font><font color="#990000">5</font><font color="#000000">, </font><font color="#990000">5</font><font color="#000000">, kernel</font><font color="#000000">))</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">BufferedImage blurred = cOp.filter</font><font color="#000000">(</font><font color="#000000">dateImage, </font><font color="#7f0055"><b>null</b></font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">dateGraphics.dispose</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff"> </font><font color="#7f0055"><b>int </b></font><font color="#000000">iWidth = input.getWidth</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#7f0055"><b>int </b></font><font color="#000000">iHeight = input.getHeight</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#7f0055"><b>int </b></font><font color="#000000">cHeight = iWidth * </font><font color="#990000">2 </font><font color="#000000">/ </font><font color="#990000">3</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#7f0055"><b>int </b></font><font color="#000000">dHeight = </font><font color="#000000">(</font><font color="#000000">iHeight - cHeight</font><font color="#000000">) </font><font color="#000000">/ </font><font color="#990000">2</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff"> </font><font color="#7f0055"><b>int </b></font><font color="#000000">y = </font><font color="#000000">(</font><font color="#000000">iHeight - dHeight</font><font color="#000000">) </font><font color="#000000">- blurred.getHeight</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#7f0055"><b>int </b></font><font color="#000000">x = iWidth - blurred.getWidth</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff"> </font><font color="#000000">graphics.drawImage</font><font color="#000000">(</font><font color="#000000">blurred, x - fontSize, y - </font><font color="#990000">2 </font><font color="#000000">* fontSize, </font><font color="#7f0055"><b>null</b></font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">graphics.setFont</font><font color="#000000">(</font><font color="#000000">font</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">graphics.setColor</font><font color="#000000">(</font><font color="#000000">Color.white</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">graphics.setRenderingHint</font><font color="#000000">(</font><font color="#000000">RenderingHints.KEY_ANTIALIASING,</font><br />
<font color="#ffffff"> </font><font color="#000000">RenderingHints.VALUE_ANTIALIAS_ON</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">graphics.drawString</font><font color="#000000">(</font><font color="#000000">dateStamp, x, y</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">graphics.dispose</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff"> </font><font color="#7f0055"><b>int </b></font><font color="#000000">lastDotIndex = inputFilename.lastIndexOf</font><font color="#000000">(</font><font color="#990000">'.'</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">String outputFilename = inputFilename.substring</font><font color="#000000">(</font><font color="#990000">0</font><font color="#000000">, lastDotIndex</font><font color="#000000">)</font><br />
<font color="#ffffff"> </font><font color="#000000">+ </font><font color="#2a00ff">".new" </font><font color="#000000">+ inputFilename.substring</font><font color="#000000">(</font><font color="#000000">lastDotIndex</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">FileOutputStream out = </font><font color="#7f0055"><b>new </b></font><font color="#000000">FileOutputStream</font><font color="#000000">(</font><font color="#000000">outputFilename</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#3f7f5f">/* encodes image as a JPEG data stream */</font><br />
<font color="#ffffff"> </font><font color="#000000">JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder</font><font color="#000000">(</font><font color="#000000">out</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam</font><font color="#000000">(</font><font color="#000000">input</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">param.setQuality</font><font color="#000000">(</font><font color="#990000">0.9f</font><font color="#000000">, </font><font color="#7f0055"><b>true</b></font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">encoder.setJPEGEncodeParam</font><font color="#000000">(</font><font color="#000000">param</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">encoder.encode</font><font color="#000000">(</font><font color="#000000">input</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">System.out.println</font><font color="#000000">(</font><font color="#2a00ff">"Ending with '" </font><font color="#000000">+ inputFilename + </font><font color="#2a00ff">"'"</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"> </font><font color="#000000">}</font>
Of course, it's not a pinnacle of Java2D programming, nor was it intended to. Since i don't have any imaging-related java.net project, i'm not intending to polish it to perfection. It even uses classes in the com.sun.image.codec.jpeg package. Hereby it is released to the public domain - feel free to use, reuse and abuse it in any way - but don't come back if your nuclear reactor stops functioning because of this :)
The result is quite OK:

- Login or register to post comments
- Printer-friendly version
- kirillcool's blog
- 1639 reads





