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:
|
||||
ext = ".pict";
|
||||
break;
|
||||
case Picture.DIB:
|
||||
ext = ".dib";
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
|
@ -174,6 +174,9 @@ public abstract class PictureData {
|
||||
case Picture.PNG:
|
||||
pict = new PNG();
|
||||
break;
|
||||
case Picture.DIB:
|
||||
pict = new DIB();
|
||||
break;
|
||||
default:
|
||||
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));
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user