<changes>
<release version="3.7-SNAPSHOT" date="2010-??-??">
+ <action dev="POI-DEVELOPERS" type="fix">43161 - fixed construction of the DIB picture header</action>
+ <action dev="POI-DEVELOPERS" type="add">49311 - initial support for reading AES-encrypted/write-protected OOXML files</action>
<action dev="POI-DEVELOPERS" type="fix">48718 - Make the creation of multiple, un-modified fonts in a row in XSSF match the old HSSF behaviour</action>
<action dev="POI-DEVELOPERS" type="fix">44916 - Allow access to the HSSFPatriarch from HSSFSheet once created</action>
<action dev="POI-DEVELOPERS" type="add">48779 - Allow you to get straight from a CellStyle to a Color, irrespective of if the Color is indexed or inline-defined</action>
<action dev="POI-DEVELOPERS" type="fix">48339 - fixed ExternalNameRecord to properly distinguish DDE data from OLE data items </action>
<action dev="POI-DEVELOPERS" type="fix">47920 - allow editing workbooks embedded into PowerPoint files</action>
<action dev="POI-DEVELOPERS" type="add">48343 - added implementation of SUBTOTAL function</action>
- <action dev="POI-DEVELOPERS" type="add">49311 - initial support for reading AES-encrypted/write-protected OOXML files</action>
</release>
<release version="3.6" date="2009-12-14">
<action dev="POI-DEVELOPERS" type="fix">48332 - fixed XSSFSheet autoSizeColumn() to tolerate empty RichTextString</action>
public int getSignature(){
return 0x7A80;
}
-
+
public byte[] getData(){
- byte[] data = super.getData();
+ return addBMPHeader ( super.getData() );
+ }
+ public static byte[] addBMPHeader(byte[] data){
// 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);
+ // read the size of the image and calculate the overall file size
+ // and the offset where the bitmap starts
+ int imageSize = LittleEndian.getInt(data, 0x22 - HEADER_SIZE);
+ int fileSize = data.length + HEADER_SIZE;
+ int offset = fileSize - imageSize;
+
+ // specifies the size, in bytes, of the bitmap file - must add the length of the header
+ LittleEndian.putInt(header, 2, fileSize);
+ // Reserved; set to zero
+ LittleEndian.putInt(header, 6, 0);
+ // the offset, i.e. starting address, of the byte where the bitmap data can be found
+ LittleEndian.putInt(header, 10, offset);
+
//DIB data is the header + dib bytes
byte[] dib = new byte[header.length + data.length];
System.arraycopy(header, 0, dib, 0, header.length);