【发布时间】:2023-04-08 08:18:01
【问题描述】:
我正在尝试在 java 中实现 Floyd-Steinberg 算法,但我仍然有一些错误?!在我的代码中我无法解决。也许你们中的一些人有一个建议我如何解决这个问题。
方法如下
public DitheringGUI dith(String fileName) {
DitheringGUI g = new DitheringGUI(fileName);
for(int y = 0 ; y<g.img.getHeight();y++){
for(int x = 0 ; x < g.img.getWidth();x++){
Color oldColor = g.img.getColor(x, y);
Color newColor = palette(oldColor);
g.img.set(x, y, newColor);
int quant_Error = oldColor.getRed() - newColor.getRed();
if(x+1 < g.img.getWidth()) {
g.img.set(x+1,y,new Color( g.img.getColor(x+1, y).getRed()+quant_Error*(7/16),
g.img.getColor(x+1, y).getRed()+quant_Error*(7/16),
g.img.getColor(x+1, y).getRed()+quant_Error*(7/16)));
}
if(x-1 >=0 && y+1 <g.img.getHeight()){
g.img.set(x-1,y+1,new Color( g.img.getColor(x-1, y+1).getRed()+quant_Error*(3/16),
g.img.getColor(x-1, y+1).getRed()+quant_Error*(3/16),
g.img.getColor(x-1, y+1).getRed()+quant_Error*(3/16)));
}
if(y+1 < g.img.getHeight()){
g.img.set(x,y+1,new Color( g.img.getColor(x, y+1).getRed()+quant_Error*(5/16),
g.img.getColor(x, y+1).getRed()+quant_Error*(5/16),
g.img.getColor(x, y+1).getRed()+quant_Error*(5/16)));
}
if(x+1 < g.img.getWidth() && y+1 < g.img.getHeight()){
g.img.set(x+1,y+1,new Color( g.img.getColor(x+1, y+1).getRed()+quant_Error*(1/16),
g.img.getColor(x+1, y+1).getRed()+quant_Error*(1/16),
g.img.getColor(x+1, y+1).getRed()+quant_Error*(1/16)));
}
}
}
return g;
}
实际的问题是它只是黑白而不是抖动,这意味着没有灰度。
我的输入是这样的:http://www.directupload.net/file/d/3985/spd2k9wq.png
我的输出是:http://www.directupload.net/file/d/3985/s24rq7qo.png
请注意,“抖动”图像过度抖动并且几乎是黑色的。
【问题讨论】:
-
链接到示例输入和预期输出可能非常有用。
-
在错误分布之后,您的颜色分量可能会溢出,这可能会导致不正确的结果。当您创建
new Color时,最好测试该值是否落入 0..255 范围内。问题也可能在palette方法内部。请将其添加到帖子中。 -
私人调色板(颜色 oldColor){ int avg =oldColor.getRed(); int BoW = avg
-
@lolio:我尝试将您的图片添加到您的问题正文中,如果您的声誉足够高,这是首选的方法。不过也有问题。该网站似乎不允许直接链接到图像或拖放。我只是在您的问题中添加了链接。下次请使用其他图片网站,例如 imgur,