mirror of https://github.com/apache/poi.git
Support custom image renderers
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@664491 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
ab0486268d
commit
796075ff52
|
@ -0,0 +1,51 @@
|
||||||
|
package org.apache.poi.hslf.blip;
|
||||||
|
|
||||||
|
import org.apache.poi.hslf.usermodel.PictureData;
|
||||||
|
import org.apache.poi.hslf.model.Picture;
|
||||||
|
import org.apache.poi.util.POILogger;
|
||||||
|
import org.apache.poi.util.POILogFactory;
|
||||||
|
|
||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates BufferedImage using javax.imageio.ImageIO and draws it in the specified graphics.
|
||||||
|
*
|
||||||
|
* @author Yegor Kozlov.
|
||||||
|
*/
|
||||||
|
public class BitmapPainter implements ImagePainter {
|
||||||
|
protected POILogger logger = POILogFactory.getLogger(this.getClass());
|
||||||
|
|
||||||
|
public void paint(Graphics2D graphics, PictureData pict, Picture parent) {
|
||||||
|
BufferedImage img;
|
||||||
|
try {
|
||||||
|
img = ImageIO.read(new ByteArrayInputStream(pict.getData()));
|
||||||
|
}
|
||||||
|
catch (Exception e){
|
||||||
|
logger.log(POILogger.WARN, "ImageIO failed to create image. image.type: " + pict.getType());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Rectangle anchor = parent.getAnchor();
|
||||||
|
Image scaledImg = img.getScaledInstance(anchor.width, anchor.height, Image.SCALE_SMOOTH);
|
||||||
|
graphics.drawImage(scaledImg, anchor.x, anchor.y, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,71 @@
|
||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
package org.apache.poi.hslf.blip;
|
||||||
|
|
||||||
|
import org.apache.poi.hslf.model.Picture;
|
||||||
|
import org.apache.poi.hslf.usermodel.PictureData;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A common interface for objects that can render ppt picture data.
|
||||||
|
* <p>
|
||||||
|
* Subclasses can redefine it and use third-party libraries for actual rendering,
|
||||||
|
* for example, Bitmaps can be rendered using javax.imageio.* , WMF can be rendered using Apache Batik,
|
||||||
|
* PICT can be rendered using Apple QuickTime API for Java, etc.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* A typical usage is as follows:
|
||||||
|
* <code>
|
||||||
|
* public WMFPaiter implements ImagePainter{
|
||||||
|
* public void paint(Graphics2D graphics, PictureData pict, Picture parent){
|
||||||
|
* DataInputStream is = new DataInputStream(new ByteArrayInputStream(pict.getData()));
|
||||||
|
* org.apache.batik.transcoder.wmf.tosvg.WMFRecordStore wmfStore =
|
||||||
|
* new org.apache.batik.transcoder.wmf.tosvg.WMFRecordStore();
|
||||||
|
* try {
|
||||||
|
* wmfStore.read(is);
|
||||||
|
* } catch (IOException e){
|
||||||
|
* return;
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* Rectangle anchor = parent.getAnchor();
|
||||||
|
* float scale = (float)anchor.width/wmfStore.getWidthPixels();
|
||||||
|
*
|
||||||
|
* org.apache.batik.transcoder.wmf.tosvg.WMFPainter painter =
|
||||||
|
* new org.apache.batik.transcoder.wmf.tosvg.WMFPainter(wmfStore, 0, 0, scale);
|
||||||
|
* graphics.translate(anchor.x, anchor.y);
|
||||||
|
* painter.paint(graphics);
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* PictureData.setImagePainter(Picture.WMF, new WMFPaiter());
|
||||||
|
* ...
|
||||||
|
* </code>
|
||||||
|
* Subsequenet calls of Slide.draw(Graphics gr) will use WMFPaiter for WMF images.
|
||||||
|
*
|
||||||
|
* @author Yegor Kozlov.
|
||||||
|
*/
|
||||||
|
public interface ImagePainter {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Paints the specified picture data
|
||||||
|
*
|
||||||
|
* @param graphics the graphics to paintb into
|
||||||
|
* @param pict the data to paint
|
||||||
|
* @param parent the shapes that owns the picture data
|
||||||
|
*/
|
||||||
|
public void paint(Graphics2D graphics, PictureData pict, Picture parent);
|
||||||
|
}
|
|
@ -17,6 +17,8 @@
|
||||||
package org.apache.poi.hslf.usermodel;
|
package org.apache.poi.hslf.usermodel;
|
||||||
|
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
|
import org.apache.poi.util.POILogger;
|
||||||
|
import org.apache.poi.util.POILogFactory;
|
||||||
import org.apache.poi.hslf.model.Picture;
|
import org.apache.poi.hslf.model.Picture;
|
||||||
import org.apache.poi.hslf.blip.*;
|
import org.apache.poi.hslf.blip.*;
|
||||||
import org.apache.poi.hslf.exceptions.HSLFException;
|
import org.apache.poi.hslf.exceptions.HSLFException;
|
||||||
|
@ -25,6 +27,7 @@ import java.io.OutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.awt.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A class that represents image data contained in a slide show.
|
* A class that represents image data contained in a slide show.
|
||||||
|
@ -33,19 +36,21 @@ import java.security.NoSuchAlgorithmException;
|
||||||
*/
|
*/
|
||||||
public abstract class PictureData {
|
public abstract class PictureData {
|
||||||
|
|
||||||
|
protected POILogger logger = POILogFactory.getLogger(this.getClass());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Size of the image checksum calculated using MD5 algorithm.
|
* Size of the image checksum calculated using MD5 algorithm.
|
||||||
*/
|
*/
|
||||||
protected static final int CHECKSUM_SIZE = 16;
|
protected static final int CHECKSUM_SIZE = 16;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Binary data of the picture
|
* Binary data of the picture
|
||||||
*/
|
*/
|
||||||
private byte[] rawdata;
|
private byte[] rawdata;
|
||||||
/**
|
/**
|
||||||
* The offset to the picture in the stream
|
* The offset to the picture in the stream
|
||||||
*/
|
*/
|
||||||
protected int offset;
|
protected int offset;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns type of this picture.
|
* Returns type of this picture.
|
||||||
|
@ -71,6 +76,13 @@ public abstract class PictureData {
|
||||||
*/
|
*/
|
||||||
protected abstract int getSignature();
|
protected abstract int getSignature();
|
||||||
|
|
||||||
|
protected static ImagePainter[] painters = new ImagePainter[8];
|
||||||
|
static {
|
||||||
|
PictureData.setImagePainter(Picture.PNG, new BitmapPainter());
|
||||||
|
PictureData.setImagePainter(Picture.JPEG, new BitmapPainter());
|
||||||
|
PictureData.setImagePainter(Picture.DIB, new BitmapPainter());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the raw binary data of this Picture excluding the first 8 bytes
|
* Returns the raw binary data of this Picture excluding the first 8 bytes
|
||||||
* which hold image signature and size of the image data.
|
* which hold image signature and size of the image data.
|
||||||
|
@ -212,4 +224,30 @@ public abstract class PictureData {
|
||||||
return getData().length;
|
return getData().length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void draw(Graphics2D graphics, Picture parent){
|
||||||
|
ImagePainter painter = painters[getType()];
|
||||||
|
if(painter != null) painter.paint(graphics, this, parent);
|
||||||
|
else logger.log(POILogger.WARN, "Rendering is not supported: " + getClass().getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register ImagePainter for the specified image type
|
||||||
|
*
|
||||||
|
* @param type image type, must be one of the static constants defined in the <code>Picture<code> class.
|
||||||
|
* @param painter
|
||||||
|
*/
|
||||||
|
public static void setImagePainter(int type, ImagePainter painter){
|
||||||
|
painters[type] = painter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return ImagePainter for the specified image type
|
||||||
|
*
|
||||||
|
* @param type blip type, must be one of the static constants defined in the <code>Picture<code> class.
|
||||||
|
* @return ImagePainter for the specified image type
|
||||||
|
*/
|
||||||
|
public static ImagePainter getImagePainter(int type){
|
||||||
|
return painters[type];
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
package org.apache.poi.hslf.model;
|
||||||
|
|
||||||
|
import junit.framework.*;
|
||||||
|
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.awt.*;
|
||||||
|
|
||||||
|
import org.apache.poi.hslf.usermodel.SlideShow;
|
||||||
|
import org.apache.poi.hslf.usermodel.PictureData;
|
||||||
|
import org.apache.poi.hslf.HSLFSlideShow;
|
||||||
|
import org.apache.poi.hslf.blip.ImagePainter;
|
||||||
|
import org.apache.poi.hslf.blip.BitmapPainter;
|
||||||
|
import org.apache.poi.ddf.EscherBSERecord;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test Picture shape.
|
||||||
|
*
|
||||||
|
* @author Yegor Kozlov
|
||||||
|
*/
|
||||||
|
public class TestImagePainter extends TestCase {
|
||||||
|
|
||||||
|
private static class CustomImagePainer implements ImagePainter{
|
||||||
|
public void paint(Graphics2D graphics, PictureData pict, Picture parent){
|
||||||
|
//do noting
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testImagePainter() throws Exception {
|
||||||
|
|
||||||
|
ImagePainter pntr = PictureData.getImagePainter(Picture.PNG);
|
||||||
|
assertTrue(PictureData.getImagePainter(Picture.PNG) instanceof BitmapPainter);
|
||||||
|
assertTrue(PictureData.getImagePainter(Picture.JPEG) instanceof BitmapPainter);
|
||||||
|
assertTrue(PictureData.getImagePainter(Picture.DIB) instanceof BitmapPainter);
|
||||||
|
|
||||||
|
PictureData.setImagePainter(Picture.WMF, new CustomImagePainer());
|
||||||
|
assertTrue(PictureData.getImagePainter(Picture.WMF) instanceof CustomImagePainer);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue