From 283d76485f27be3996706649634282edbc2567c9 Mon Sep 17 00:00:00 2001 From: zapata Date: Fri, 17 Jan 2003 17:34:52 +0000 Subject: [PATCH] Image handler that stores imagedata outside the database. This handler is only temporary: a new media handler system will replace this. --- source/mircoders/media/ImageProcessor.java | 153 ++++++++++++++++++ source/mircoders/media/MediaHandlerGeneric.java | 4 +- .../mircoders/media/MediaHandlerImagesExtern.java | 173 +++++++++++++++++++++ source/mircoders/producer/ProducerMedia.java | 2 +- 4 files changed, 329 insertions(+), 3 deletions(-) create mode 100755 source/mircoders/media/ImageProcessor.java create mode 100755 source/mircoders/media/MediaHandlerImagesExtern.java diff --git a/source/mircoders/media/ImageProcessor.java b/source/mircoders/media/ImageProcessor.java new file mode 100755 index 00000000..cc1d4988 --- /dev/null +++ b/source/mircoders/media/ImageProcessor.java @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2001, 2002 The Mir-coders group + * + * This file is part of Mir. + * + * Mir is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Mir is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Mir; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, The Mir-coders gives permission to link + * the code of this program with the com.oreilly.servlet library, any library + * licensed under the Apache Software License, The Sun (tm) Java Advanced + * Imaging library (JAI), The Sun JIMI library (or with modified versions of + * the above that use the same license as the above), and distribute linked + * combinations including the two. You must obey the GNU General Public + * License in all respects for all of the code used other than the above + * mentioned libraries. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If you do + * not wish to do so, delete this exception statement from your version. + */ + +package mircoders.media; + +import java.io.*; +import java.awt.image.renderable.ParameterBlock; +import javax.media.jai.*; +import com.sun.media.jai.codec.*; + +import mir.log.*; + +/** + * + *

Title: Image processor

+ *

Description: Temporary image processor class. (Made for the immediate needs of CMI brasil. + * Will become obsolete when mh's media handler rewrite is finished.

+ * @author Zapata + * @version 1.0 + */ + +public class ImageProcessor { + static final LoggerWrapper logger = new LoggerWrapper("media"); + + private static final int DEFAULT_MAX_ICON_SIZE=120; + private static final int DEFAULT_MAX_IMAGE_SIZE=640; + + private PlanarImage image; + private PlanarImage scaledImage; + + private byte[] iconData; + private byte[] imageData; + private int iconWidth; + private int iconHeight; + private String imageType; + +// public ImageScaler( + + public ImageProcessor(SeekableStream anImageStream, String anImageType) throws IOException { + image = JAI.create("stream", anImageStream); + scaledImage = image; + imageType = anImageType; + } + + public ImageProcessor(File aFile, String anImageType) throws IOException { + this(new FileSeekableStream(aFile), anImageType); + } + + public ImageProcessor(byte[] anImageData, String anImageType) throws IOException { + this(new ByteArraySeekableStream(anImageData), anImageType); + } + + public void descaleImage(int aMaxSize) throws java.io.IOException { + descaleImage(aMaxSize, 0); + } + + public void descaleImage(int aMaxSize, float aMinDescale) throws java.io.IOException { + descaleImage(aMaxSize, aMaxSize, aMinDescale); + } + + public void descaleImage(int aMaxWidth, int aMaxHeight, float aMinDescale) throws java.io.IOException { + float scale; + scaledImage = image; + + if ((aMaxWidth>0 && image.getWidth()>aMaxWidth) || (aMaxHeight>0 && image.getHeight()>aMaxHeight)) + { + logger.info("Scaling image"); + + scale=1; + + if (aMaxWidth>0 && image.getWidth()>aMaxWidth) { + scale = Math.min(scale, (float) aMaxWidth / (float) image.getWidth()); + } + if (aMaxHeight>0 && image.getHeight()>aMaxHeight) { + scale = Math.min(scale, (float) aMaxHeight / (float) image.getHeight()); + } + + if (1-scale>aMinDescale) { + scaleImage(scale); + } + } + } + + public void scaleImage(float aScalingFactor) throws java.io.IOException { + ParameterBlockJAI params = new ParameterBlockJAI("scale"); + params.addSource(image); + + params.setParameter("xScale", aScalingFactor); + params.setParameter("yScale", aScalingFactor); + params.setParameter("xTrans", 0.0F); + params.setParameter("yTrans", 0.0F); + params.setParameter("interpolation", new InterpolationBilinear()); + scaledImage = JAI.create("scale", params); + } + + public int getWidth() { + return image.getWidth(); + } + + public int getHeight() { + return image.getWidth(); + } + + public int getScaledWidth() { + return scaledImage.getWidth(); + } + + public int getScaledHeight() { + return scaledImage.getWidth(); + } + + public void writeScaledData(OutputStream aStream) { + JAI.create("encode", scaledImage, aStream, imageType, null); + } + + public byte[] getScaledData() { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + writeScaledData(outputStream); + return outputStream.toByteArray(); + } + + public void writeScaledData(File aFile) throws IOException { + writeScaledData(new FileOutputStream(aFile)); + } +} diff --git a/source/mircoders/media/MediaHandlerGeneric.java b/source/mircoders/media/MediaHandlerGeneric.java index 5f7b5531..0c351583 100755 --- a/source/mircoders/media/MediaHandlerGeneric.java +++ b/source/mircoders/media/MediaHandlerGeneric.java @@ -59,7 +59,7 @@ import mir.storage.*; * * @see mir.media.MirMedia * @author mh - * @version $Id: MediaHandlerGeneric.java,v 1.11 2002/11/27 08:57:32 mh Exp $ + * @version $Id: MediaHandlerGeneric.java,v 1.12 2003/01/17 17:34:52 zapata Exp $ */ public class MediaHandlerGeneric implements MirMedia @@ -122,7 +122,7 @@ public class MediaHandlerGeneric implements MirMedia return in; } - public InputStream getIcon (Entity ent) { + public InputStream getIcon (Entity ent) throws MirMediaException { return null; } diff --git a/source/mircoders/media/MediaHandlerImagesExtern.java b/source/mircoders/media/MediaHandlerImagesExtern.java new file mode 100755 index 00000000..2ecdc899 --- /dev/null +++ b/source/mircoders/media/MediaHandlerImagesExtern.java @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2001, 2002 The Mir-coders group + * + * This file is part of Mir. + * + * Mir is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Mir is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Mir; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, The Mir-coders gives permission to link + * the code of this program with the com.oreilly.servlet library, any library + * licensed under the Apache Software License, The Sun (tm) Java Advanced + * Imaging library (JAI), The Sun JIMI library (or with modified versions of + * the above that use the same license as the above), and distribute linked + * combinations including the two. You must obey the GNU General Public + * License in all respects for all of the code used other than the above + * mentioned libraries. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If you do + * not wish to do so, delete this exception statement from your version. + */ + +package mircoders.media; + + +import java.lang.*; +import java.io.*; +import java.util.*; +import java.lang.reflect.*; + +import freemarker.template.SimpleList; + +import mir.media.*; +import mir.misc.*; +import mir.entity.*; +import mir.storage.*; + +import mircoders.entity.*; +import mircoders.storage.*; + + +/** + * Image handler that stores images outside of the database. Will be replaced by the new + * media handling system. + * @author Zapata + * @version 1.0 + */ + +public class MediaHandlerImagesExtern extends MediaHandlerGeneric +{ + public void produce(Entity anImageEntity, Entity mediaTypeEnt) throws MirMediaException + { + try { + String date = anImageEntity.getValue("date"); + String datePath = StringUtil.webdbDate2path(date); + String ext = "." + mediaTypeEnt.getValue("name"); + String filePath = datePath + anImageEntity.getId() + ext; + String iconFilePath = MirConfig.getProp("Producer.StorageRoot") + getIconStoragePath() + filePath; + String imageFilePath = getStoragePath() + File.separator + filePath; + + File imageFile = new File(imageFilePath); + File iconFile = new File(iconFilePath); + + if (!imageFile.exists()) { + throw new MirMediaException("error in MediaHandlerImagesExtern.produce(): " + filePath + " does not exist!"); + } + else { + ImageProcessor processor = new ImageProcessor(imageFile, "JPEG"); + + processor.descaleImage(50, 0.8F); + File dir = new File(iconFile.getParent()); + if (dir!=null && !dir.exists()){ + dir.mkdirs(); + } + processor.writeScaledData(iconFile); + + anImageEntity.setValueForProperty("img_height", new Integer(processor.getHeight()).toString()); + anImageEntity.setValueForProperty("img_width", new Integer(processor.getWidth()).toString()); + + anImageEntity.setValueForProperty("icon_height", new Integer(processor.getScaledHeight()).toString()); + anImageEntity.setValueForProperty("icon_width", new Integer(processor.getScaledWidth()).toString()); + + anImageEntity.setValueForProperty("icon_path", getIconStoragePath()+filePath); + anImageEntity.setValueForProperty("publish_path", filePath); + + anImageEntity.update(); + } + } + catch(Throwable t) { + t.printStackTrace(System.out); + throw new MirMediaException(t.getMessage()); + } + } + + + public InputStream getIcon(Entity anImageEntity) throws MirMediaException + { + try { + Entity mediaType = DatabaseUploadedMedia.getInstance().getMediaType( + anImageEntity); + + String date = anImageEntity.getValue("date"); + String datePath = StringUtil.webdbDate2path(date); + String ext = "." + mediaType.getValue("name"); + String filePath = MirConfig.getProp("Producer.StorageRoot") + + getIconStoragePath() + datePath + anImageEntity.getId() + ext; + + return new FileInputStream(new File(filePath)); + } + catch (Throwable t) { + throw new MirMediaException(t.getMessage()); + } + } + + public String getStoragePath() + { + return MirConfig.getProp("Producer.Image.Path"); + } + + public String getIconStoragePath() + { + return MirConfig.getProp("Producer.Image.IconPath"); + } + + public String getPublishHost() + { + return StringUtil.removeSlash(MirConfig.getProp("Producer.Image.Host")); + } + + public String getTinyIconName() + { + return MirConfig.getProp("Producer.Icon.TinyImage"); + } + + public String getBigIconName() + { + return MirConfig.getProp("Producer.Icon.BigImage"); + } + + public String getIconAltName() + { + return "Image"; + } + + public boolean isVideo() + { + return false; + } + + public boolean isAudio() + { + return false; + } + + public boolean isImage () + { + return true; + } + + public String getDescr(Entity mediaType) + { + return "image/jpeg"; + } +} diff --git a/source/mircoders/producer/ProducerMedia.java b/source/mircoders/producer/ProducerMedia.java index 7f77cc40..be0c1b3b 100755 --- a/source/mircoders/producer/ProducerMedia.java +++ b/source/mircoders/producer/ProducerMedia.java @@ -107,7 +107,7 @@ abstract public class ProducerMedia extends Producer { e.toString()); logHTML(htmlout, "problem with media id: "+currentMedia.getId()+ " failed!: "+e.toString()); - e.printStackTrace(htmlout); + e.printStackTrace(System.out); } } -- 2.11.0