Hi all,
Included is a ImageContentTransformer which uses attributes 'short-
edge-length' and 'long-edge-length' to scale an image. If the
aspect ratio of all of your images is consistent (i.e. 4:3), the
scaling factor should also be consistent. Yay! :)
This is useful where you want to, say, create thumbnails of all
your photos. For example, when uploading a photo and setting the
'long-edge-width' to 1024, both 1600x1200 images and 1200x1600
images will have a scaling factor of .64. If the existing 'width'
attribute were used instead, these images would have scaling
factors of .64 and .85, respectively -- probably not what you
expected.
An example of a bean and corresponding meta data is included in
the javadoc.
Also, I'm open to alternate class name suggestions...! :)
Shalom (complete peace),
Josh
---------------------------------------------------------------------
---
package com.upbear.rife.cmf.transform;
import java.awt.Image;
import java.util.Map;
import java.util.logging.Logger;
import com.uwyn.rife.cmf.dam.exceptions.ContentManagerException;
import com.uwyn.rife.cmf.format.exceptions.FormatException;
import com.uwyn.rife.cmf.transform.ImageContentTransformer;
import com.uwyn.rife.tools.ImageWaiter;
/**
* Transforms an image.
* <p>The following attributes are supported:
* <table>
* <tr>
* <td valign="top"><code>long-edge-length</code>
* <td>Changes an image so the longest edge is the indicated
size. The short edge * will be scaled appropriately.</td>
* </tr>
* * <tr>
* <td valign="top"><code>short-edge-length</code>
* <td>Changes an image so the shortest edge is the indicated
size. The long edge * will be scaled appropriately.</td>
* </tr>
* </table>
*
* <p>Example:</p>
* <pre><code>
* public class MyBean {
*
* private int id = -1;
* private byte[] image = null;
* * public int getId() { return id; }
* public void setId(int id) { this.id = id; }
* * public byte[] getImage() { return image; }
* public void setImage(byte[] image) { this.image = image; }
* public void setImageThumbnail(byte[] imageThumbnail) { } //
dummy setter * public byte[] getImageThumbnail() { return image; }
* }
* * * public class MyBeanMetaData extends MetaData {
* private static final PhotoScalingImageTransformer
IMG_TRANSFORMER = new PhotoScalingImageTransformer();
* public void activateMetaData()
* {
* // Store the full-size image
* addConstraint(new ConstrainedProperty("image")
* .notNull(true)
* .file(true)
* .mimeType(MimeType.IMAGE_JPEG));
* * // Store the image scaled down to have it's shortest edge
be 74 pixels
* addConstraint(new ConstrainedProperty("imageThumbnail")
* .notNull(true)
* .file(true)
* .listed(true)
* .position(1)
* .editable(false)
* .mimeType(MimeType.IMAGE_JPEG)
* .contentAttribute("short-edge-length", 74)
* .transformer(IMG_TRANSFORMER)
* );
* }
* }
* * </code></pre>
* * @author Joshua Hansen (joshuah[remove] at up-bear dot net)
* @see ConstrainedProperty, ContentTransformer
*/
/* * Slight modification of the width/height scaling code
com.uwyn.rife.cmf.format.ImageFormatter.
*/
public class PhotoScalingImageTransformer implements
ImageContentTransformer {
public Image transform(Image image, Map<String, String> attr)
throws ContentManagerException {
// perform additional conversions according to the provided
attributes
//Logger.getLogger(this.getClass().getName()).info("Inside
transform()");
//Logger.getLogger(this.getClass().getName()).info
("attr.containsKey(\"long-edge-length\"=["+attr.containsKey("long-
edge-length")+"]");
//Logger.getLogger(this.getClass().getName()).info
("attr.containsKey(\"short-edge-length\"=["+attr.containsKey
("short-edge-length")+"]");
if (attr != null)
{
if (attr.containsKey("long-edge-length") || attr.containsKey
("short-edge-length") )
{
// retrieve the attributes
String lEL_value = attr.get("long-edge-length");
String sEL_value =
attr.get("short-edge-length");
int lEL = -1;
int sEL = -1;
if (lEL_value != null)
{
try
{
lEL =
Integer.parseInt(lEL_value);
}
catch (NumberFormatException e)
{
new ContentManagerException(new
FormatException(e));
}
}
if (sEL_value != null)
{
try
{
sEL =
Integer.parseInt(sEL_value);
}
catch (NumberFormatException e)
{
new ContentManagerException(new
FormatException(e));
}
}
int width = -1;
int height = -1;
if (lEL >= 0 || sEL >= 0)
{
int orig_width = image.getWidth(null);
int orig_height = image.getHeight(null);
// If the width is the longer side, set
it to the lEL.
if( orig_width > orig_height ) {
if( lEL >= 0 ) {
width = lEL;
} else if ( sEL >= 0 ) {
height = sEL;
}
} else {
if( lEL >= 0 ) {
height = lEL;
} else if ( sEL >= 0 ) {
width = sEL;
}
}
// ensure that the aspect is preserved
at all times
if (width >= 0 && height >= 0)
{
double width_ratio =
((double)orig_width)/width;
double height_ratio =
((double)orig_height)/height;
if (width_ratio > height_ratio)
{
height = -1;
}
else if (width_ratio <
height_ratio)
{
width = -1;
}
}
// only do a rescale when the
dimensions are actually different
if ((width >= 0 && width != orig_width)
||
(height >= 0 && height !=
orig_height))
{
image = image.getScaledInstance(width, height,
Image.SCALE_SMOOTH);
if (image.getWidth(null) < 0 ||
image.getHeight(null) <
0)
{
ImageWaiter.wait(image);
}
}
}
}
}
return image;
}
}
---------------------------------------------------------------------
---
_______________________________________________
Rife-users mailing list
Rife-users@uwyn.com
http://lists.uwyn.com/mailman/listinfo/rife-users