Support for DIB picture types, from Bug 40740
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@464984 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
5f167f01b2
commit
59ced4d73e
81
src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java
Normal file
81
src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Copyright 2002-2004 Apache Software Foundation
|
||||||
|
|
||||||
|
Licensed 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.util.LittleEndian;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a DIB picture data in a PPT file
|
||||||
|
*
|
||||||
|
* @author Yegor Kozlov
|
||||||
|
*/
|
||||||
|
public class DIB extends Bitmap {
|
||||||
|
/**
|
||||||
|
* Size of the BITMAPFILEHEADER structure preceding the actual DIB bytes
|
||||||
|
*/
|
||||||
|
public static final int HEADER_SIZE = 14;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return type of this picture
|
||||||
|
* @see org.apache.poi.hslf.model.Picture#DIB
|
||||||
|
*/
|
||||||
|
public int getType(){
|
||||||
|
return Picture.DIB;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DIB signature is <code>0x7A80</code>
|
||||||
|
*
|
||||||
|
* @return DIB signature (<code>0x7A80</code>)
|
||||||
|
*/
|
||||||
|
public int getSignature(){
|
||||||
|
return 0x7A80;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getData(){
|
||||||
|
byte[] data = super.getData();
|
||||||
|
|
||||||
|
// bitmap file-header, corresponds to a
|
||||||
|
// Windows BITMAPFILEHEADER structure
|
||||||
|
// (For more information, consult the Windows API Programmer's reference )
|
||||||
|
byte[] header = new byte[HEADER_SIZE];
|
||||||
|
//Specifies the file type. It must be set to the signature word BM (0x4D42) to indicate bitmap.
|
||||||
|
LittleEndian.putInt(header, 0, 0x4D42);
|
||||||
|
//Specifies the size, in bytes, of the bitmap file.
|
||||||
|
LittleEndian.putInt(header, 2, data.length); //DIB length including the header
|
||||||
|
//Reserved; set to zero
|
||||||
|
LittleEndian.putInt(header, 6, 0);
|
||||||
|
//the offset, in bytes, from the header to the bitmap bits (looks like it is always 2)
|
||||||
|
LittleEndian.putInt(header, 10, 2);
|
||||||
|
|
||||||
|
//DIB data is the header + dib bytes
|
||||||
|
byte[] dib = new byte[header.length + data.length];
|
||||||
|
System.arraycopy(header, 0, dib, 0, header.length);
|
||||||
|
System.arraycopy(data, 0, dib, header.length, data.length);
|
||||||
|
|
||||||
|
return dib;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setData(byte[] data) throws IOException {
|
||||||
|
//cut off the bitmap file-header
|
||||||
|
byte[] dib = new byte[data.length-HEADER_SIZE];
|
||||||
|
System.arraycopy(data, HEADER_SIZE, dib, 0, dib.length);
|
||||||
|
super.setData(dib);
|
||||||
|
}
|
||||||
|
}
|
@ -64,6 +64,9 @@ public class ImageExtractor {
|
|||||||
case Picture.PICT:
|
case Picture.PICT:
|
||||||
ext = ".pict";
|
ext = ".pict";
|
||||||
break;
|
break;
|
||||||
|
case Picture.DIB:
|
||||||
|
ext = ".dib";
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -174,6 +174,9 @@ public abstract class PictureData {
|
|||||||
case Picture.PNG:
|
case Picture.PNG:
|
||||||
pict = new PNG();
|
pict = new PNG();
|
||||||
break;
|
break;
|
||||||
|
case Picture.DIB:
|
||||||
|
pict = new DIB();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw new IllegalArgumentException("Unsupported picture type: " + type);
|
throw new IllegalArgumentException("Unsupported picture type: " + type);
|
||||||
}
|
}
|
||||||
|
BIN
src/scratchpad/testcases/org/apache/poi/hslf/data/sci_cec.dib
Normal file
BIN
src/scratchpad/testcases/org/apache/poi/hslf/data/sci_cec.dib
Normal file
Binary file not shown.
After Width: | Height: | Size: 94 B |
@ -249,6 +249,46 @@ public class TestPictures extends TestCase{
|
|||||||
assertTrue(Arrays.equals(src_bytes, ppt_bytes));
|
assertTrue(Arrays.equals(src_bytes, ppt_bytes));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test read/write DIB
|
||||||
|
*/
|
||||||
|
public void testDIB() throws Exception {
|
||||||
|
SlideShow ppt = new SlideShow();
|
||||||
|
|
||||||
|
Slide slide = ppt.createSlide();
|
||||||
|
File img = new File(cwd, "sci_cec.dib");
|
||||||
|
int idx = ppt.addPicture(img, Picture.DIB);
|
||||||
|
Picture pict = new Picture(idx);
|
||||||
|
assertEquals(idx, pict.getPictureIndex());
|
||||||
|
slide.addShape(pict);
|
||||||
|
|
||||||
|
//serialize and read again
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
ppt.write(out);
|
||||||
|
out.close();
|
||||||
|
|
||||||
|
ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())));
|
||||||
|
|
||||||
|
//make sure we can read this picture shape and it refers to the correct picture data
|
||||||
|
Shape[] sh = ppt.getSlides()[0].getShapes();
|
||||||
|
assertEquals(1, sh.length);
|
||||||
|
pict = (Picture)sh[0];
|
||||||
|
assertEquals(idx, pict.getPictureIndex());
|
||||||
|
|
||||||
|
//check picture data
|
||||||
|
PictureData[] pictures = ppt.getPictureData();
|
||||||
|
//the Picture shape refers to the PictureData object in the Presentation
|
||||||
|
assertEquals(pict.getPictureData(), pictures[0]);
|
||||||
|
|
||||||
|
assertEquals(1, pictures.length);
|
||||||
|
assertEquals(Picture.DIB, pictures[0].getType());
|
||||||
|
assertTrue(pictures[0] instanceof DIB);
|
||||||
|
//compare the content of the initial file with what is stored in the PictureData
|
||||||
|
byte[] src_bytes = read(img);
|
||||||
|
byte[] ppt_bytes = pictures[0].getData();
|
||||||
|
assertTrue(Arrays.equals(src_bytes, ppt_bytes));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read file into a byte array
|
* Read file into a byte array
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user