Java - 有没有一种快速的方法可以用其他颜色替换某些颜色位图中的所有实例?

标签 java swing colors javax.imageio

在 Java 中有没有一种快速的方法可以用其他颜色替换位图中某些颜色的所有实例?

我正在处理的图像是一个非常大的 5616 x 2160 24 位非透明未索引位图,尽管此位图的像素值会有所不同。

这是我目前正在使用的代码,但它太慢了: http://pastebin.com/UjgwgB0V

public class DisplayImage extends JFrame {

public DisplayImage(boolean resize, boolean mapCountries) throws IOException {
super("Province Map");
File mapProvinceFile = new File("map\\provinces.bmp");
BufferedImage mapProvinceImage = ImageIO.read(mapProvinceFile);

byte[] pixels = (byte[])mapProvinceImage.getRaster().getDataElements(0, 0, mapProvinceImage.getWidth(), mapProvinceImage.getHeight(), null);

if (mapCountries) {
    for (int i = 0; i < Victoria2Stats.provinceDefinitionArray.size(); i++) {
        for (int p = 0; p < pixels.length-3; p = p + 3) {
           if ((byte)Victoria2Stats.provinceDefinitionArray.get(i).rgb[0] == pixels[p]) {
               if ((byte)Victoria2Stats.provinceDefinitionArray.get(i).rgb[1] == pixels[p+1]) {
                   if ((byte)Victoria2Stats.provinceDefinitionArray.get(i).rgb[2] == pixels[p+2]) {
                       try {
                           if ((Victoria2Stats.provinceDataTable[i].ownerColor == null) && !(Victoria2Stats.provinceDataTable[i].lifeRating == 0)) {
                                pixels[p] = (byte)255;
                                pixels[p+1] = (byte)255;
                                pixels[p+2] = (byte)255;
                           } else {
                                pixels[p] = (byte)(Victoria2Stats.provinceDataTable[i].ownerColor.getRed());
                                pixels[p+1] = (byte)(Victoria2Stats.provinceDataTable[i].ownerColor.getBlue());
                                pixels[p+2] = (byte)(Victoria2Stats.provinceDataTable[i].ownerColor.getGreen());
                           }
                       } catch (NullPointerException e) {
                       // I realise this is a bad practice, but it is unrelated to the question and will be fixed later
                       }
                   }
               }
           }
      }
  }
}

BufferedImage buffer = new BufferedImage(mapProvinceImage.getWidth(), mapProvinceImage.getHeight(), mapProvinceImage.getType());
DataBuffer dataBuffer = new DataBufferByte(pixels, pixels.length);

SampleModel sampleModel = new ComponentSampleModel(DataBuffer.TYPE_BYTE, mapProvinceImage.getWidth(), mapProvinceImage.getHeight(), 3, mapProvinceImage.getWidth()*3, new int[]{0,1,2});
Raster raster = Raster.createRaster(sampleModel, dataBuffer, null);
buffer.setData(raster);

BufferedImage fixedImage = ImageUtils.verticalflip(buffer);
ImageIcon ii = new ImageIcon(fixedImage);
JScrollPane jsp = new JScrollPane(new JLabel(ii));
getContentPane().add(jsp);
setSize(800, 600);
setVisible(true);
}

}

这是一个示例图像:http://www.mediafire.com/?rttpk4o33b3oj74

我正在考虑以某种方式将它转换为索引位图,然后交换颜色索引,但我想不出任何方法来使用 Java 成功分配/重新创建颜色索引。

最佳答案

java.awt.image.LookupOp 的实例使用合适的 LookupTable 可能会更快。举个例子here .

ColorConvertOp,图文并茂here , 需要合适的 ColorSpace

ImageJ , 提到 here , 可用于批处理。

关于Java - 有没有一种快速的方法可以用其他颜色替换某些颜色位图中的所有实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12984550/

相关文章:

java - 实现 hashCode 和延迟加载

java - jssc getInputStream() getOutputstream()

java - OR 条件实现使用逻辑 :equal

java - java中鼠标输入问题

java - Eclipse项目无法运行

java - 测试颜色是否相等

c# - 为什么不能声明类型为 System.Drawing.Color 的常量?

java - 如何在Java中用十进制格式表示 "1.275"到 "1.28"

java - 在单个单元格上应用 TableCellRenderer

java - 当我在 JTextpane 中打开文件时自动为 Java 关键字着色