- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在玩 HTML5 中的网络摄像头过滤器。得到一个Atkinson dither非常适合那种老式 Mac 的感觉。
现在我正在尝试为 1989 Gameboy 的感觉制作拜耳有序抖动选项。
我read up on the algorithm ,但我无法将此伪代码转换为 JavaScript:
for each y
for each x
oldpixel := pixel[x][y] + threshold_map_4x4[x mod 4][y mod 4]
newpixel := find_closest_palette_color(oldpixel)
pixel[x][y] := newpixel
有没有 AS3、PHP 或 JS 的示例?你能解释一下 threshold_map_4x4[x mod 4][y mod 4]
发生了什么吗?
(用 Meemoo Gameboy GIFerizer 制作)
想通了。在维基百科中它说“例如,在单色渲染中,如果像素值(缩放到 0-9 范围内)小于矩阵相应单元格中的数字,则将该像素绘制为黑色,否则,将其绘制为白色”在 js 中,我通过平均当前像素 (0-255) 和 map 的值 (15-240) 并将其与阈值(通常为 129)进行比较得到了很好的结果:
var map = (imageData.data[currentPixel] + bayerThresholdMap[x%4][y%4]) / 2;
imageData.data[currentPixel] = (map < threshold) ? 0 : 255;
这是我使用不同算法的整个单色函数:
var bayerThresholdMap = [
[ 15, 135, 45, 165 ],
[ 195, 75, 225, 105 ],
[ 60, 180, 30, 150 ],
[ 240, 120, 210, 90 ]
];
var lumR = [];
var lumG = [];
var lumB = [];
for (var i=0; i<256; i++) {
lumR[i] = i*0.299;
lumG[i] = i*0.587;
lumB[i] = i*0.114;
}
function monochrome(imageData, threshold, type){
var imageDataLength = imageData.data.length;
// Greyscale luminance (sets r pixels to luminance of rgb)
for (var i = 0; i <= imageDataLength; i += 4) {
imageData.data[i] = Math.floor(lumR[imageData.data[i]] + lumG[imageData.data[i+1]] + lumB[imageData.data[i+2]]);
}
var w = imageData.width;
var newPixel, err;
for (var currentPixel = 0; currentPixel <= imageDataLength; currentPixel+=4) {
if (type === "none") {
// No dithering
imageData.data[currentPixel] = imageData.data[currentPixel] < threshold ? 0 : 255;
} else if (type === "bayer") {
// 4x4 Bayer ordered dithering algorithm
var x = currentPixel/4 % w;
var y = Math.floor(currentPixel/4 / w);
var map = Math.floor( (imageData.data[currentPixel] + bayerThresholdMap[x%4][y%4]) / 2 );
imageData.data[currentPixel] = (map < threshold) ? 0 : 255;
} else if (type === "floydsteinberg") {
// Floyd–Steinberg dithering algorithm
newPixel = imageData.data[currentPixel] < 129 ? 0 : 255;
err = Math.floor((imageData.data[currentPixel] - newPixel) / 16);
imageData.data[currentPixel] = newPixel;
imageData.data[currentPixel + 4 ] += err*7;
imageData.data[currentPixel + 4*w - 4 ] += err*3;
imageData.data[currentPixel + 4*w ] += err*5;
imageData.data[currentPixel + 4*w + 4 ] += err*1;
} else {
// Bill Atkinson's dithering algorithm
newPixel = imageData.data[currentPixel] < threshold ? 0 : 255;
err = Math.floor((imageData.data[currentPixel] - newPixel) / 8);
imageData.data[currentPixel] = newPixel;
imageData.data[currentPixel + 4 ] += err;
imageData.data[currentPixel + 8 ] += err;
imageData.data[currentPixel + 4*w - 4 ] += err;
imageData.data[currentPixel + 4*w ] += err;
imageData.data[currentPixel + 4*w + 4 ] += err;
imageData.data[currentPixel + 8*w ] += err;
}
// Set g and b pixels equal to r
imageData.data[currentPixel + 1] = imageData.data[currentPixel + 2] = imageData.data[currentPixel];
}
return imageData;
}
我会很感激优化提示。
最佳答案
这是我所有的单色抖动函数,可用作网络 worker :https://github.com/meemoo/meemooapp/blob/master/src/nodes/image-monochrome-worker.js
使用网络摄像头进行现场演示:http://meemoo.org/iframework/#gist/3721129
关于javascript - JavaScript 中的单色抖动 (Bayer, Atkinson, Floyd–Steinberg),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12422407/
我正在尝试实现 floyd 算法,但它似乎不起作用。 我使用了维基百科的伪代码算法没有弗洛伊德 http://img15.hostingpics.net/pics/298623Capturedcran
我知道Floyd–Steinberg dithering算法不能用像素着色器实现,因为该算法是严格顺序的。但是也许存在一些高度并行的抖动算法,其视觉输出类似于 Floyd-Steinberg 算法?
我想知道除了Floyd-Steinberg抖动之外,还有什么著名的抖动算法存在吗? 最佳答案 还有一些其他的误差扩散算法,Wikipedia page on dithering给出了一个很好的列表和图
我一直在互联网上搜索以获取此信息,但没有成功。 我正在使用 C++ 中的 Steinberg 的 VST SDK。我正在开发一个效果器插件,我需要知道声音文件的长度,即其中的帧数。所以我从 proce
我正在尝试编译一个简单的程序,该程序已包含在 Steinberg VST SDK 中。 我遇到的问题是我的编译器无法找到文件,除非它有绝对路径。出于某种原因,代码的编写方式使我的编译器找不到文件需要它
我正在使用从 stackoverflow 获得的一段代码,用于 floyd steinberg 抖动算法。 它如下。但它没有按预期正确抖动图像。是否有人对此有正确的实现,或者有人可以更正以下代码。实际
我正在制作一个程序,我想在其中拍摄图像并将其调色板减少到 60 种颜色的预设调色板,然后添加抖动效果。这似乎涉及两件事: 一种颜色距离算法,它遍历每个像素,获取其颜色,然后将其更改为调色板中最接近它的
我正在玩 HTML5 中的网络摄像头过滤器。得到一个Atkinson dither非常适合那种老式 Mac 的感觉。 Live | Code 现在我正在尝试为 1989 Gameboy 的感觉制作拜耳
就我的研究而言,我发现 GNU C 默认使用 cdecl 进行函数调用。 VST SDK 在使用 GNU C 编译时将调用明确定义为 cdecl,并吐出以下错误: again.cpp:27:15: w
我在使用 GraphicsMagic 将图像转换为 1 位抖动图像时遇到问题。转换后的图像将用作热敏打印机的输入。 我正在使用以下命令: gm convert input.jpg -resize 38
我在pgm中有图像 使用此功能后: void convertWithDithering(array_type& pixelgray) { int oldpixel; int newpi
如何使用 Floyd–Steinberg dithering 将 24 位 PNG 转换为 3 位 PNG ? java.awt.image.BufferedImage 应该用于获取和设置 RGB 值
我正在开发一个基于桌面的 PHP 应用程序,我们需要捕捉一个人的图像并使用 Zebra GC420t 打印机将其打印在标签上预期的图像应如下图所示。 当我尝试打印时,它会给出如下图所示的输出。 我正在
我是一名优秀的程序员,十分优秀!