有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java通过仅使用iText限制比例和缩小比例来转换图像

我有一个简单的Java应用程序,它接收不同大小的图像并将其输出为PDF格式。它使用类com.lowagie.text.Image(与iText<;=2.1.7一起使用的类),导入图像时,像素尺寸和dpi是已知的

如果图像不违反8.5英寸x11英寸纸张的约束条件,我想显示它。如果它太宽,我需要它来确定宽度减少的百分比,以计算在计算PDF上图像的最终宽度和高度时高度的变化。如果受高度限制,如果图像太高,则情况正好相反。最后,如果它太宽太高,我需要确定哪个是更大的减少百分比,并将高度和宽度都减少该值

我不想放大8.5x11限制范围内的图像(例如8.5x11->;11x14),只想缩小太大的图像

以下是我已知的价值观:

Original Width
Original Height
DPI

以下是我尝试过的许多尝试,但都没有成功。我很感激任何帮助

PlainW是图像的原始宽度,而PlainH是原始高度

if (PlainW >= 612) { //x is over or equal
    xDiff = PlainW - 612;
    xScale = PlainW / 612;
    if (PlainH < 792) { //y is under
        yDiff = 792 - PlainH;
        yScale = PlainH / 792;
    } else if (PlainH == 792) { //y is equal
        yDiff = 792 - PlainH;
        yScale = PlainH / 792;
    } else if (PlainH > 792) { //y is over
        yDiff = PlainH - 792;
        yScale = PlainH / 792;
    }
} else if (PlainW < 612) { //x is under
    xDiff = 612 - PlainW;
    xScale = PlainW / 162;
    if (PlainH < 792) { //y is under
        yDiff = 792 - PlainH;
        yScale = PlainH / 792;
    } else if (PlainH == 792) { //y is equal
        yDiff = 792 - PlainH;
        yScale = PlainH / 792;
    } else if (PlainH > 792) { //y is over
        yDiff = PlainH - 792;
        yScale = PlainH / 792;
    }
}

共 (1) 个答案

  1. # 1 楼答案

    你的代码真的很难理解!我将向您展示如何使其更简单

    这是你的代码:

    if (PlainW >= 612) { //x is over or equal
        xDiff = PlainW - 612;
        xScale = PlainW / 612;
        if (PlainH < 792) { //y is under
            yDiff = 792 - PlainH;
            yScale = PlainH / 792;
        } else if (PlainH == 792) { //y is equal
            yDiff = 792 - PlainH;
            yScale = PlainH / 792;
        } else if (PlainH > 792) { //y is over
            yDiff = PlainH - 792;
            yScale = PlainH / 792;
        }
    } else if (PlainW < 612) { //x is under
        xDiff = 612 - PlainW;
        xScale = PlainW / 162;
        if (PlainH < 792) { //y is under
            yDiff = 792 - PlainH;
            yScale = PlainH / 792;
        } else if (PlainH == 792) { //y is equal
            yDiff = 792 - PlainH;
            yScale = PlainH / 792;
        } else if (PlainH > 792) { //y is over
            yDiff = PlainH - 792;
            yScale = PlainH / 792;
        }
    }
    

    在每个条件中,你都有yScale = PlainH / 792;,把它放在外面,就像这样(另外我去掉了无用的注释):

    if (PlainW >= 612) {
        xDiff = PlainW - 612;
        xScale = PlainW / 612;
        if (PlainH < 792) {
            yDiff = 792 - PlainH;
        } else if (PlainH == 792) {
            yDiff = 792 - PlainH;
        } else if (PlainH > 792) {
            yDiff = PlainH - 792;
        }
    } else if (PlainW < 612) {
        xDiff = 612 - PlainW;
        xScale = PlainW / 162;
        if (PlainH < 792) {
            yDiff = 792 - PlainH;
        } else if (PlainH == 792) {
            yDiff = 792 - PlainH;
        } else if (PlainH > 792) {
            yDiff = PlainH - 792;
        }
    }
    yScale = PlainH / 792;
    

    然后你有一些完全相同的条件,^

    if (PlainW >= 612) {
        xDiff = PlainW - 612;
        xScale = PlainW / 612;
        if (PlainH <= 792) {
            yDiff = 792 - PlainH;
        } else if (PlainH > 792) {
            yDiff = PlainH - 792;
        }
    } else if (PlainW < 612) {
        xDiff = 612 - PlainW;
        xScale = PlainW / 162;
        if (PlainH <= 792) {
            yDiff = 792 - PlainH;
        } else if (PlainH > 792) {
            yDiff = PlainH - 792;
        }
    }
    yScale = PlainH / 792;
    

    但是等等!比较两个整数,然后从最大整数中减去最小整数?为什么不直接取差值的绝对值呢

    if (PlainW >= 612) {
        xDiff = PlainW - 612;
        xScale = PlainW / 612;
        yDiff = Math.abs(PlainH - 792);
    } else if (PlainW < 612) {
        xDiff = 612 - PlainW;
        xScale = PlainW / 162;
        yDiff = Math.abs(PlainH - 792);
    }
    yScale = PlainH / 792;
    

    同样,我在条件语句中看到了相同的代码。把它移到外面去

    if (PlainW >= 612) {
        xDiff = PlainW - 612;
    } else if (PlainW < 612) {
        xDiff = 612 - PlainW;
    }
    xScale = PlainW / 612;
    yDiff = Math.abs(PlainH - 792);
    yScale = PlainH / 792;
    

    同样,比较2个整数并从最大整数中减去最小整数可以替换为Math.abs

    xDiff = Math.abs(PlainW - 612);
    xScale = PlainW / 612;
    yDiff = Math.abs(PlainH - 792);
    yScale = PlainH / 792;
    

    看!您的代码从27行减少到只有4行,它包含条件,并且更容易理解