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-unsubscr...@poi.apache.org For additional commands, e-mail: commits-h...@poi.apache.org