【发布时间】:2015-10-24 22:59:32
【问题描述】:
我编写了一个算法来通过双线性缩放方法缩放图像,但它没有按预期工作。我真的在我的代码中找不到任何错误,但它产生了错误的输出:
Process(context: ImageData): ImageData {
var imageData = context;
var w = imageData.width;
var h = imageData.height;
var small = new Uint32Array((<any>imageData.data).buffer);
var big = new Uint32Array(small.length * (this.factor * this.factor));
var w2 = this.factor * imageData.width;
var h2 = this.factor * imageData.height;
var x_ratio = ((w) / w2);
var y_ratio = ((h) / h2);
for (var i = 0, f = h2; i < f; ++i) {
var py_a = (i * y_ratio);
var py = py_a | 0;
var py_t = py_a - py;
for (var j = 0, k = w2; j < k; ++j) {
var px_a = (j * x_ratio);
var px = px_a | 0;
var index = ((py * w) + px) | 0;
var px_t = px_a - px;
var fy1 = small[index] + (small[index + 1] - small[index]) * px_t;
var fy2 = small[index + w] + (small[index + w + 1] - small[index + w]) * px_t;
var tmp = fy1 + (fy2 - fy1) * py_t;
big[i * w2 + j] = tmp;
}
}
var ar = new Uint8ClampedArray(big.buffer);
var newImage = new ImageData(ar, w2, h2);
return newImage;
}
我通常想知道是否可以将每个通道一起处理还是应该拆分(至少 alpha)它?
【问题讨论】:
-
图片数据代表什么?您所拥有的适用于灰度图像,其中每个字节代表一个像素的亮度。如果每个字节代表调色板中的索引而不是亮度级别,那将解释您得到的模式。在这种情况下,您必须在读取每个值时将其转换为亮度级别,并在编写时将其转换为调色板索引。
-
@Guffa 它进入 ImageData,使其成为 RGBA 像素
-
离题:边缘的伪像看起来值可能超出了它们的范围(可能是每个通道),但我真的很喜欢它的外观:)
标签: javascript algorithm image-processing typescript