Search in sources :

Example 1 with PictureData

use of org.apache.poi.ss.usermodel.PictureData in project poi by apache.

the class ImageUtils method setPreferredSize.

/**
     * Calculate and set the preferred size (anchor) for this picture.
     *
     * @param scaleX the amount by which image width is multiplied relative to the original width.
     * @param scaleY the amount by which image height is multiplied relative to the original height.
     * @return the new Dimensions of the scaled picture in EMUs
     */
public static Dimension setPreferredSize(Picture picture, double scaleX, double scaleY) {
    ClientAnchor anchor = picture.getClientAnchor();
    boolean isHSSF = (anchor instanceof HSSFClientAnchor);
    PictureData data = picture.getPictureData();
    Sheet sheet = picture.getSheet();
    // in pixel
    Dimension imgSize = getImageDimension(new ByteArrayInputStream(data.getData()), data.getPictureType());
    // in emus
    Dimension anchorSize = ImageUtils.getDimensionFromAnchor(picture);
    final double scaledWidth = (scaleX == Double.MAX_VALUE) ? imgSize.getWidth() : anchorSize.getWidth() / EMU_PER_PIXEL * scaleX;
    final double scaledHeight = (scaleY == Double.MAX_VALUE) ? imgSize.getHeight() : anchorSize.getHeight() / EMU_PER_PIXEL * scaleY;
    double w = 0;
    int col2 = anchor.getCol1();
    int dx2 = 0;
    //space in the leftmost cell
    w = sheet.getColumnWidthInPixels(col2++);
    if (isHSSF) {
        w *= 1d - anchor.getDx1() / 1024d;
    } else {
        w -= anchor.getDx1() / (double) EMU_PER_PIXEL;
    }
    while (w < scaledWidth) {
        w += sheet.getColumnWidthInPixels(col2++);
    }
    if (w > scaledWidth) {
        //calculate dx2, offset in the rightmost cell
        double cw = sheet.getColumnWidthInPixels(--col2);
        double delta = w - scaledWidth;
        if (isHSSF) {
            dx2 = (int) ((cw - delta) / cw * 1024);
        } else {
            dx2 = (int) ((cw - delta) * EMU_PER_PIXEL);
        }
        if (dx2 < 0)
            dx2 = 0;
    }
    anchor.setCol2(col2);
    anchor.setDx2(dx2);
    double h = 0;
    int row2 = anchor.getRow1();
    int dy2 = 0;
    h = getRowHeightInPixels(sheet, row2++);
    if (isHSSF) {
        h *= 1 - anchor.getDy1() / 256d;
    } else {
        h -= anchor.getDy1() / (double) EMU_PER_PIXEL;
    }
    while (h < scaledHeight) {
        h += getRowHeightInPixels(sheet, row2++);
    }
    if (h > scaledHeight) {
        double ch = getRowHeightInPixels(sheet, --row2);
        double delta = h - scaledHeight;
        if (isHSSF) {
            dy2 = (int) ((ch - delta) / ch * 256);
        } else {
            dy2 = (int) ((ch - delta) * EMU_PER_PIXEL);
        }
        if (dy2 < 0)
            dy2 = 0;
    }
    anchor.setRow2(row2);
    anchor.setDy2(dy2);
    Dimension dim = new Dimension((int) Math.round(scaledWidth * EMU_PER_PIXEL), (int) Math.round(scaledHeight * EMU_PER_PIXEL));
    return dim;
}
Also used : ClientAnchor(org.apache.poi.ss.usermodel.ClientAnchor) HSSFClientAnchor(org.apache.poi.hssf.usermodel.HSSFClientAnchor) HSSFClientAnchor(org.apache.poi.hssf.usermodel.HSSFClientAnchor) ByteArrayInputStream(java.io.ByteArrayInputStream) Dimension(java.awt.Dimension) Sheet(org.apache.poi.ss.usermodel.Sheet) PictureData(org.apache.poi.ss.usermodel.PictureData)

Aggregations

Dimension (java.awt.Dimension)1 ByteArrayInputStream (java.io.ByteArrayInputStream)1 HSSFClientAnchor (org.apache.poi.hssf.usermodel.HSSFClientAnchor)1 ClientAnchor (org.apache.poi.ss.usermodel.ClientAnchor)1 PictureData (org.apache.poi.ss.usermodel.PictureData)1 Sheet (org.apache.poi.ss.usermodel.Sheet)1