首页 > 解决方案 > 将给定像素长度转换为宽度和高度的程序

问题描述

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

标签: javaimagepixel

解决方案


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

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

推荐阅读