【问题标题】:Java BufferedImage map colorsJava BufferedImage 地图颜色
【发布时间】:2018-06-06 03:25:32
【问题描述】:

我正在尝试编写一个程序,该程序将 bufferedImage 作为输入并将所有接近黑色的颜色(R

public static BufferedImage BlackAndWhite(BufferedImage image) {

    ColorModel model = new BlackWhiteColorModel(DataBuffer.TYPE_INT);
    WritableRaster raster = image.getRaster();

    BufferedImage newImage = new BufferedImage(model, raster, false, null);

    return newImage;
}

BlackWhiteColorModel 被定义为

public class BlackWhiteColorModel extends ColorModel {

public BlackWhiteColorModel(int bits) {
    super(bits);
}

@Override
public int getRed(int pixel) {
    int[] rgb = getRgb(pixel);

    if (rgb[0] < 32 && rgb[1] < 32 && rgb[2] < 32) {
        return 0;
    } else {
        return 255;
    }
}

@Override
public int getGreen(int pixel) {
    int[] rgb = getRgb(pixel);

    if (rgb[0] < 32 && rgb[1] < 32 && rgb[2] < 32) {
        return 0;
    } else {
        return 255;
    }
}

@Override
public int getBlue(int pixel) {
    int[] rgb = getRgb(pixel);

    if (rgb[0] < 32 && rgb[1] < 32 && rgb[2] < 32) {
        return 0;
    } else {
        return 255;
    }
}

@Override
public int getAlpha(int pixel) {
    return pixel;
}

private int[] getRgb(int pixel) {
    int r = (pixel) & 0xFF;
    int g = (pixel >> 8) & 0xFF;
    int b = (pixel >> 16) & 0xFF;
    int a = (pixel >> 24) & 0xFF;

    return new int[]{r, g, b, a};
}



}

但是,我最终得到了 isCompatibleRasterException。谁能给我一些建议?

【问题讨论】:

  • 您需要黑白图像还是灰度图像?

标签: java image-processing colors


【解决方案1】:

(1) 你没有实现合约的方法之一:isCompatibleRaster。鉴于您的问题陈述,这是一个过于乐观的实现,运行良好:

@Override
public boolean isCompatibleRaster(Raster raster) {
    return true;
}

(2) getRedgetGreengetBlue 具有相同的代码。这是一个完整的程序,它将公共代码分解为一个名为getColor 的新方法。该程序运行无误:

import java.awt.*;
import java.awt.image.*;

public class BlackWhiteColorModel extends ColorModel {
    public static void main(String[] args) {
        BufferedImage bufferedImage = new BufferedImage(200,200,BufferedImage.TYPE_INT_RGB);
         Graphics g = bufferedImage.getGraphics();
         g.drawString("Hello, World", 20,20);
        blackAndWhite(bufferedImage);
    }

    public static BufferedImage blackAndWhite(BufferedImage image) {
        ColorModel model = new BlackWhiteColorModel(DataBuffer.TYPE_INT);
        WritableRaster raster = image.getRaster();

        BufferedImage newImage = new BufferedImage(model, raster, false, null);

        return newImage;
    }

    public BlackWhiteColorModel(int bits) {
        super(bits);
    }

    private int getColor(int pixel) {
        int[] rgb = getRgb(pixel);

        if (rgb[0] < 32 && rgb[1] < 32 && rgb[2] < 32) {
            return 0;
        } else {
            return 255;
        }
    }

    @Override
    public int getRed(int pixel) {
        return getColor(pixel);
    }

    @Override
    public int getGreen(int pixel) {
        return getColor(pixel);
    }

    @Override
    public int getBlue(int pixel) {
        return getColor(pixel);
    }

    @Override
    public int getAlpha(int pixel) {
        return pixel;
    }

    @Override
    public boolean isCompatibleRaster(Raster raster) {
        return true;
    }

    private int[] getRgb(int pixel) {
        int r = (pixel) & 0xFF;
        int g = (pixel >> 8) & 0xFF;
        int b = (pixel >> 16) & 0xFF;
        int a = (pixel >> 24) & 0xFF;

        return new int[]{r, g, b, a};
    }
}

【讨论】:

  • 谢谢。但是,我用不同的 colorModel 创建新图像的方式不起作用。如果我想保存 BlackAndWhite(BufferedImage image) 的输出,则不会创建文件,也不会引发异常。文本识别也不起作用。您是否知道其他一些(功能性)方法,如何创建具有不同 ColorModel 但数据相同的新图像?
  • 您正在扩大范围,这会改变问题,请接受此答案并在扩大范围内提出新问题。
【解决方案2】:

你想要的是一个阈值操作,例如:

我猜你不想因为性能问题而对像素进行迭代。如果这是真的,我强烈建议您像这样使用OpenCV

BufferedImage image = null; //use your image here
//Convert image to OpenCv Mat
byte[] pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
Mat mat = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8UC3);
mat.put(0, 0, pixels);

//do something with the Mat e.g:
Imgproc.threshold(...); 

//Convert back
mat.get(0, 0, pixels);

如果您进行更多图像处理,性能至少会快 10 倍

【讨论】:

  • 谢谢你!我会在假期检查它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 2012-11-02
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多