在不丟失或添加不必要的像素的情況下,計算將像素陣列盡可能接近矩形/正方形所需的大小的最佳方法是什么?
以 100 像素的影像為例,適合所有像素的最佳尺寸是 10x10,因為 10*10 是 100,也就是說,它添加的額外像素最少(在本例中為 0)。100x1 也適合所有像素,但它確實比 10x10 的矩形小得多。
并且為了適合 101 像素,最佳尺寸是 8x13,雖然 8*13 是 104,但它是唯一不丟失任何像素、添加很少額外像素 (3) 并且具有最矩形形狀的乘法。
到目前為止,我已經能夠通過以下規則解決這個問題:
- 寬度除以高度必須得到大于 0.5 且小于 1.5 的值。(這將確保只保留最矩形的值)。
- 寬度乘以高度必須產生大于或等于像素數的值。
通過應用這些規則,我最終得到了多種可能性,最好的一種是相乘時最接近像素數的一種。
這是我的代碼目前的樣子:
function loopPixels(pixels, callback) {
for (let x = 2; x < pixels; x ) {
for (let y = 2; y < pixels; y ) {
callback(x, y);
}
}
}
function getRectangle(pixels) {
let result = {extraPixels: pixels};
loopPixels(pixels, (left, right) => {
let half = (left/right);
let total = (left*right);
if (Math.round(half) == 1 && total >= pixels) {
if (total-pixels < result.extraPixels) {
result = {size: [left, right], extraPixels: total-pixels};
}
}
})
return result;
}
getRectangle(101) // must return [[8, 13], 3] (width, height and additional pixels)
它所做的就是保持一個變數來保存 的最小結果(width*height)-pixels,即找到的值與像素數之間的差值。
雖然它適用于少量像素,具有巨大的值(可能會回傳 1000x1000 大小),但速度非常慢。
這種緩慢有什么具體原因嗎?是否有可能在不使用嵌套 for 回圈的情況下獲得相同的結果?
uj5u.com熱心網友回復:
以下代碼可以提高效率,但它非常具有描述性。它需要一個像素數 ( n) 和一個k表示最佳k匹配的值。
讓我們嘗試 6800 萬像素以獲得一些合理的縱橫比。
function getReasonableDimensions(n,k){
var max = ~~Math.sqrt(n);
return Array.from({length: max}, (_,i,a) => [n%(max-i),max-i])
.sort((a,b) => a[0] - b[0])
.slice(0,k)
.map(t => [Math.floor(n/t[1]), t[1]]);
}
var res = getReasonableDimensions(68000000,10)
console.log(JSON.stringify(res));
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/401760.html
標籤:javascript 图像处理
上一篇:如何使用陣列不允許程式在JS中的瑣事游戲中重復問題?
下一篇:重置進度/計時器欄
