我试图拍摄一张照片并将其制作成棕褐色。出于某种原因,即使我从我买的书中得到它来自学java,但代码仍无法正常工作。是否有遗漏的东西或某个不正确的地方?我见过的每一个问题都有一些我甚至都不知道的疯狂公式和符号。有人能帮助我吗?
import images.APImage;
import images.Pixel;
public class Sepia{
public static void main(String[] args){
APImage image = new APImage("DogStockPhoto.jpg");
//image.draw();
//converts to grayscale
for(Pixel p: image){
int red = p.getRed();
int green = p.getGreen();
int blue = p.getBlue();
int average = (red + green + blue)/3;
p.setRed(average);
p.setGreen(average);
p.setBlue(average);
//converts to sepia
if(red < 63){
red = (int)(red * 1.1);
blue = (int)(blue * 0.9);
}else if(red < 192){
red = (int)(red * 1.15);
blue = (int)(blue * 0.85);
}else{
red = Math.min((int)(red * 1.08), 255);
blue = (int)(blue * 0.93);
}
}
image.draw();
}
}
此外,在我尝试绘制图像后,它仍处于灰度级。
答案 0 :(得分:0)
评论是正确的。您将像素值平均化,使其变灰。然后计算像素的棕褐色值,但不要将其分配回像素。因此,您的图像保持灰度。
在if ... else块之后:
p.setRed(red);
p.setBlue(blue);
答案 1 :(得分:0)
OK!谢谢你们的反馈意见。我想出了几件事。我应该告诉它用新的“红色”和“蓝色”替换灰色。但是,这并不是所有在同一个地方都有效,这意味着你需要两个for语句,一个用于灰度,另一个用于棕褐色。在搞清楚这一切之后一切顺利!这是我完成的代码:
import images.APImage;
import images.Pixel;
public class Sepia{
public static void main(String[] args){
APImage image = new APImage("DogStockPhoto.jpg");
//image.draw();
//converts to grayscale
for(Pixel p: image){
int red = p.getRed();
int green = p.getGreen();
int blue = p.getBlue();
int average = (red + green + blue)/3;
p.setRed(average);
p.setGreen(average);
p.setBlue(average);
}
//converts to sepia
for(Pixel p: image){
int red = p.getRed();
int blue = p.getBlue();
if(red < 63){
red = (int)(red * 1.1);
blue = (int)(blue * 0.9);
}else if(red < 192){
red = (int)(red * 1.15);
blue = (int)(blue * 0.85);
}else{
red = Math.min((int)(red * 1.08), 255);
blue = (int)(blue * 0.93);
}
p.setRed(red);
p.setBlue(blue);
}
image.draw();
}
}