将给定像素长度转换为宽度和高度的程序

Program to convert the given pixels length into width and height

我有一个以像素(图像像素)为单位的输入,例如 24 像素,我的问题是将它们转换为缓冲图像的宽度和高度,对于输入 24,我不能只使用1 高 x 24 宽,它会变得太长,这意味着输出应该像 6 宽 x 4 高,其中有 24 个像素。在 java 中可以这样做吗?我想我正确地解释了我的问题...

Brute-force:从中间开始(在平方根处),然后使用 % 余数运算符从那里尝试直到找到有效的拆分。

static int optimumHeight(int areaSize) {
    if (areaSize <= 0)
        throw new IllegalArgumentException("areaSize must be positive: " + areaSize);
    for (int h = (int) Math.sqrt(areaSize); h > 1; h--)
        if (areaSize % h == 0)
            return h;
    return 1;
}

测试

for (int areaSize = 20; areaSize < 30; areaSize++) {
    int height = optimumHeight(areaSize);
    int width = areaSize / height;
    System.out.printf("%d -> %dWx%dH%n", areaSize, width, height);
}

输出

20 -> 5Wx4H
21 -> 7Wx3H
22 -> 11Wx2H
23 -> 23Wx1H
24 -> 6Wx4H
25 -> 5Wx5H
26 -> 13Wx2H
27 -> 9Wx3H
28 -> 7Wx4H
29 -> 29Wx1H

更新

areaSize为素数时,结果总是areaSize x 1H。评论 (现已删除) 要求更改为使用更大的 areaSize

static int optimumHeight(int areaSize) {
    if (areaSize <= 0)
        throw new IllegalArgumentException("areaSize must be positive: " + areaSize);
    if (areaSize <= 2)
        return 1;
    for (int h = (int) Math.sqrt(areaSize); h > 1; h--)
        if (areaSize % h == 0)
            return h;
    int altSize = areaSize + 1;
    for (int h = (int) Math.sqrt(altSize); h > 2; h--)
        if (altSize % h == 0)
            return h;
    return 2;
}

width计算需要向上取整,所以变成:

int width = (areaSize + height - 1) / height;

例子

1 -> 1Wx1H
2 -> 2Wx1H
3 -> 2Wx2H
4 -> 2Wx2H
5 -> 3Wx2H
6 -> 3Wx2H
7 -> 4Wx2H
8 -> 4Wx2H
9 -> 3Wx3H
10 -> 5Wx2H
11 -> 4Wx3H
12 -> 4Wx3H
13 -> 7Wx2H
14 -> 7Wx2H
15 -> 5Wx3H
16 -> 4Wx4H
17 -> 6Wx3H
18 -> 6Wx3H
19 -> 5Wx4H
20 -> 5Wx4H
21 -> 7Wx3H
22 -> 11Wx2H
23 -> 6Wx4H
24 -> 6Wx4H
25 -> 5Wx5H
26 -> 13Wx2H
27 -> 9Wx3H
28 -> 7Wx4H
29 -> 6Wx5H