You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ki...@apache.org on 2019/09/11 21:24:34 UTC
svn commit: r1866809 - in /poi/trunk/src:
java/org/apache/poi/hssf/usermodel/ java/org/apache/poi/sl/image/
java/org/apache/poi/util/ scratchpad/src/org/apache/poi/hslf/blip/
scratchpad/src/org/apache/poi/hwpf/usermodel/
Author: kiwiwings
Date: Wed Sep 11 21:24:34 2019
New Revision: 1866809
URL: http://svn.apache.org/viewvc?rev=1866809&view=rev
Log:
Unify PNG extraction
Added:
poi/trunk/src/java/org/apache/poi/sl/image/ImageHeaderPNG.java
- copied, changed from r1866808, poi/trunk/src/java/org/apache/poi/util/PngUtils.java
Removed:
poi/trunk/src/java/org/apache/poi/util/PngUtils.java
Modified:
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPictureData.java
poi/trunk/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java
poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java
Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPictureData.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPictureData.java?rev=1866809&r1=1866808&r2=1866809&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPictureData.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPictureData.java Wed Sep 11 21:24:34 2019
@@ -18,12 +18,11 @@
package org.apache.poi.hssf.usermodel;
-import org.apache.poi.ddf.EscherBitmapBlip;
import org.apache.poi.ddf.EscherBlipRecord;
-import org.apache.poi.ddf.EscherMetafileBlip;
+import org.apache.poi.ddf.EscherRecordTypes;
+import org.apache.poi.sl.image.ImageHeaderPNG;
import org.apache.poi.ss.usermodel.PictureData;
import org.apache.poi.ss.usermodel.Workbook;
-import org.apache.poi.util.PngUtils;
/**
* Represents binary data stored in the file. Eg. A GIF, JPEG etc...
@@ -58,20 +57,8 @@ public class HSSFPictureData implements
/* (non-Javadoc)
* @see org.apache.poi.hssf.usermodel.PictureData#getData()
*/
- public byte[] getData()
- {
- byte[] pictureData = blip.getPicturedata();
-
- //PNG created on MAC may have a 16-byte prefix which prevents successful reading.
- //Just cut it off!.
- if (PngUtils.matchesPngHeader(pictureData, 16))
- {
- byte[] png = new byte[pictureData.length-16];
- System.arraycopy(pictureData, 16, png, 0, png.length);
- pictureData = png;
- }
-
- return pictureData;
+ public byte[] getData() {
+ return new ImageHeaderPNG(blip.getPicturedata()).extractPNG();
}
/**
@@ -93,18 +80,18 @@ public class HSSFPictureData implements
* @return 'wmf', 'jpeg' etc depending on the format. never <code>null</code>
*/
public String suggestFileExtension() {
- switch (blip.getRecordId()) {
- case EscherMetafileBlip.RECORD_ID_WMF:
+ switch (EscherRecordTypes.forTypeID(blip.getRecordId())) {
+ case BLIP_WMF:
return "wmf";
- case EscherMetafileBlip.RECORD_ID_EMF:
+ case BLIP_EMF:
return "emf";
- case EscherMetafileBlip.RECORD_ID_PICT:
+ case BLIP_PICT:
return "pict";
- case EscherBitmapBlip.RECORD_ID_PNG:
+ case BLIP_PNG:
return "png";
- case EscherBitmapBlip.RECORD_ID_JPEG:
+ case BLIP_JPEG:
return "jpeg";
- case EscherBitmapBlip.RECORD_ID_DIB:
+ case BLIP_DIB:
return "dib";
default:
return "";
@@ -115,18 +102,18 @@ public class HSSFPictureData implements
* Returns the mime type for the image
*/
public String getMimeType() {
- switch (blip.getRecordId()) {
- case EscherMetafileBlip.RECORD_ID_WMF:
+ switch (EscherRecordTypes.forTypeID(blip.getRecordId())) {
+ case BLIP_WMF:
return "image/x-wmf";
- case EscherMetafileBlip.RECORD_ID_EMF:
+ case BLIP_EMF:
return "image/x-emf";
- case EscherMetafileBlip.RECORD_ID_PICT:
+ case BLIP_PICT:
return "image/x-pict";
- case EscherBitmapBlip.RECORD_ID_PNG:
+ case BLIP_PNG:
return "image/png";
- case EscherBitmapBlip.RECORD_ID_JPEG:
+ case BLIP_JPEG:
return "image/jpeg";
- case EscherBitmapBlip.RECORD_ID_DIB:
+ case BLIP_DIB:
return "image/bmp";
default:
return "image/unknown";
@@ -144,18 +131,18 @@ public class HSSFPictureData implements
* @see Workbook#PICTURE_TYPE_WMF
*/
public int getPictureType() {
- switch (blip.getRecordId()) {
- case EscherMetafileBlip.RECORD_ID_WMF:
+ switch (EscherRecordTypes.forTypeID(blip.getRecordId())) {
+ case BLIP_WMF:
return Workbook.PICTURE_TYPE_WMF;
- case EscherMetafileBlip.RECORD_ID_EMF:
+ case BLIP_EMF:
return Workbook.PICTURE_TYPE_EMF;
- case EscherMetafileBlip.RECORD_ID_PICT:
+ case BLIP_PICT:
return Workbook.PICTURE_TYPE_PICT;
- case EscherBitmapBlip.RECORD_ID_PNG:
+ case BLIP_PNG:
return Workbook.PICTURE_TYPE_PNG;
- case EscherBitmapBlip.RECORD_ID_JPEG:
+ case BLIP_JPEG:
return Workbook.PICTURE_TYPE_JPEG;
- case EscherBitmapBlip.RECORD_ID_DIB:
+ case BLIP_DIB:
return Workbook.PICTURE_TYPE_DIB;
default:
return -1;
Copied: poi/trunk/src/java/org/apache/poi/sl/image/ImageHeaderPNG.java (from r1866808, poi/trunk/src/java/org/apache/poi/util/PngUtils.java)
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/sl/image/ImageHeaderPNG.java?p2=poi/trunk/src/java/org/apache/poi/sl/image/ImageHeaderPNG.java&p1=poi/trunk/src/java/org/apache/poi/util/PngUtils.java&r1=1866808&r2=1866809&rev=1866809&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/util/PngUtils.java (original)
+++ poi/trunk/src/java/org/apache/poi/sl/image/ImageHeaderPNG.java Wed Sep 11 21:24:34 2019
@@ -15,39 +15,45 @@
limitations under the License.
==================================================================== */
-package org.apache.poi.util;
+package org.apache.poi.sl.image;
-public final class PngUtils {
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.poi.poifs.filesystem.FileMagic;
+import org.apache.poi.util.IOUtils;
+import org.apache.poi.util.RecordFormatException;
+
+public final class ImageHeaderPNG {
+
+ private static final int MAGIC_OFFSET = 16;
+
+ private byte[] data;
/**
- * File header for PNG format.
+ * @param data The raw image data
*/
- private static final byte[] PNG_FILE_HEADER =
- new byte[] { (byte) 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A };
-
- private PngUtils() {
- // no instances of this class
+ public ImageHeaderPNG(byte[] data) {
+ this.data = data;
}
/**
- * Checks if the offset matches the PNG header.
- *
- * @param data the data to check.
- * @param offset the offset to check at.
- * @return {@code true} if the offset matches.
+ * PNG created on MAC may have a 16-byte prefix which prevents successful reading.
+ * @return the trimmed PNG data
*/
- public static boolean matchesPngHeader(byte[] data, int offset) {
- if (data == null || data.length - offset < PNG_FILE_HEADER.length) {
- return false;
- }
-
- for (int i = 0; i < PNG_FILE_HEADER.length; i++) {
- if (PNG_FILE_HEADER[i] != data[i + offset]) {
- return false;
+ public byte[] extractPNG() {
+ //
+ //Just cut it off!.
+ try (InputStream is = new ByteArrayInputStream(data)) {
+ if (is.skip(MAGIC_OFFSET) == MAGIC_OFFSET && FileMagic.valueOf(is) == FileMagic.PNG) {
+ return IOUtils.toByteArray(is);
}
+ } catch (IOException e) {
+ throw new RecordFormatException("Unable to parse PNG header", e);
}
- return true;
+ return data;
}
}
Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java?rev=1866809&r1=1866808&r2=1866809&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java Wed Sep 11 21:24:34 2019
@@ -17,7 +17,7 @@
package org.apache.poi.hslf.blip;
-import org.apache.poi.util.PngUtils;
+import org.apache.poi.sl.image.ImageHeaderPNG;
/**
* Represents a PNG picture data in a PPT file
@@ -26,17 +26,7 @@ public final class PNG extends Bitmap {
@Override
public byte[] getData() {
- byte[] data = super.getData();
-
- //PNG created on MAC may have a 16-byte prefix which prevents successful reading.
- //Just cut it off!.
- if (PngUtils.matchesPngHeader(data, 16)) {
- byte[] png = new byte[data.length-16];
- System.arraycopy(data, 16, png, 0, png.length);
- data = png;
- }
-
- return data;
+ return new ImageHeaderPNG(super.getData()).extractPNG();
}
@Override
Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java?rev=1866809&r1=1866808&r2=1866809&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java Wed Sep 11 21:24:34 2019
@@ -34,7 +34,7 @@ import org.apache.poi.ddf.EscherProperty
import org.apache.poi.ddf.EscherRecord;
import org.apache.poi.hwpf.model.PICF;
import org.apache.poi.hwpf.model.PICFAndOfficeArtData;
-import org.apache.poi.util.PngUtils;
+import org.apache.poi.sl.image.ImageHeaderPNG;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;
import org.apache.poi.util.StringUtil;
@@ -169,16 +169,7 @@ public final class Picture {
else
{
// Raw data is not compressed.
- content = rawContent;
-
- //PNG created on MAC may have a 16-byte prefix which prevents successful reading.
- //Just cut it off!.
- if (PngUtils.matchesPngHeader(content, 16))
- {
- byte[] png = new byte[content.length-16];
- System.arraycopy(content, 16, png, 0, png.length);
- content = png;
- }
+ content = new ImageHeaderPNG(rawContent).extractPNG();
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org