java - 将给定像素长度转换为宽度和高度的程序
问题描述
我有一个以像素(图像像素)为单位的输入,例如 24 像素,我的问题是将它们转换为缓冲图像的宽度和高度,对于输入 24,我不能只使用 1 高度 x 24 宽度,它会变得太长,这意味着输出应该是 6 宽 x 4 高,其中有 24 个像素。在java中可以这样做吗?我想我正确地解释了我的问题......
解决方案
蛮力:从中间开始(在平方根处),然后从那里尝试直到找到有效的拆分,使用%
余数运算符。
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
推荐阅读
- c++11 - 将带有捕获列表的 C++ lambda 函数映射到函数参数
- python - 没有这样的文件或目录?
- batch-file - 批处理文件启动后立即关闭
- javascript - 在本机反应中使用静态是否有任何内存问题?
- javascript - 根据选择更改页面
- fortran - 如何在运行开始期间在各种选项中为子程序选择所需的代码
- c - 如何让线程崩溃不会导致进程崩溃?
- qt - 替换 qhash 值 no operator found 采用右手操作数类型
- elasticsearch - ElasticSearch 搜索查询计数
- ios - PHPhotoLibrary.requestAuthorization(for:, handler:) 不调用处理程序块