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