我试图编写一个程序来帮助我检查图像的任何像素中是否有某种颜色。
这是我到目前为止所做的:
public static void main(String args[]) throws IOException {
try {
//read image file
File file1 = new File("./Scan.png");
BufferedImage image1 = ImageIO.read(file1);
//write file
FileWriter fstream = new FileWriter("log1.txt");
BufferedWriter out = new BufferedWriter(fstream);
for (int y = 0; y < image1.getHeight(); y++) {
for (int x = 0; x < image1.getWidth(); x++) {
int c = image1.getRGB(x,y);
Color color = new Color(c);
if (color.getRed() < 50 && color.getGreen() > 225 && color.getBlue() > 43) {
out.write("Specified Pixel found at=" + x + "," + y);
out.newLine();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
我似乎无法让它运行,所以我很想得到一些关于如何以正确的方式做到这一点的提示。
答案 0 :(得分:1)
我刚刚测试了你的代码。它确实有效。您只需确保您使用的图像具有与您在代码中所期望的相同的颜色强度。
例如,(看似)红色像素可能不必是RGB (255, 0 , 0)
。图像格式也可能起作用。
如果您使用有损压缩图像格式(例如jpeg,png),则在保存过程中可能会更改颜色像素。
我在24位图上测试了你的代码,它可以输出一些东西。你可以先用一些基本颜色测试它:
示例:强>
if(color.equals(Color.RED))
System.out.println("Red exist!");
答案 1 :(得分:0)
也许它抛出iOException尝试这个为什么你会抛出一个你已经尝试抓住它的异常
public static void main(String args[]){
try {
//read image file
File file1 = new File("./Scan.png");
BufferedImage image1 = ImageIO.read(file1);
//write file
for (int y = 0; y < image1.getHeight(); y++) {
for (int x = 0; x < image1.getWidth(); x++) {
int c = image1.getRGB(x,y);
Color color = new Color(c);
if (color.getRed() < 50 && color.getGreen() > 225 && color.getBlue() > 43) {
System.out.println(x + "," + y);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
答案 2 :(得分:0)
可以使用以下语法接收像素值:
public class MarkableImageView extends ImageView {
ArrayList<Marker> mMarkers;
public MarkableImageView(Context context, AttributeSet attrs){
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.FILL_AND_STROKE);
for(Marker m : mMarkers){
// TODO: Draw the marker
canvas.drawCircle(m.x, m.y, 3, paint);
}
}
public boolean onTouchEvent(MotionEvent e) {
if (e.getAction() == MotionEvent.ACTION_DOWN) {
mMarkers.add(new Marker(e.getX(), e.getY()));
invalidate();
return true;
}
return false;
}
public void reset() {
mMarkers.clear();
invalidate();
}
// this class will be visible only inside MarkableImageView
private class Marker {
public float x;
public float y;
// you might want to add other properties, for example
// if you need to have different types of markers
public Marker(float x, float y) {
this.x = x;
this.y = y;
}
}
}
然后你可以在c上调用你的getRed()/ getGreen()/ getBlue()方法。