您可以嘗試將RGB圖像轉換爲灰度。如果每像素3個字節的圖像呈現爲RedGreenBlue,則可以使用以下公式:y = 0.299 * r + 0.587 * g + 0.114 * b。
要清楚地遍歷字節數組並替換顏色。下面一個例子:
byte[] newImage = new byte[rgbImage.length];
for (int i = 0; i < rgbImage.length; i += 3) {
newImage[i] = (byte) (rgbImage[i] * 0.299 + rgbImage[i + 1] * 0.587
+ rgbImage[i + 2] * 0.114);
newImage[i+1] = newImage[i];
newImage[i+2] = newImage[i];
}
UPDATE:
上面的代碼假設你正在使用的原始RGB圖像,如果你需要處理JPEG格式的文件,你可以這樣做:
try {
BufferedImage inputImage = ImageIO.read(new File("input.jpg"));
BufferedImage outputImage = new BufferedImage(
inputImage.getWidth(), inputImage.getHeight(),
BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < inputImage.getWidth(); x++) {
for (int y = 0; y < inputImage.getHeight(); y++) {
int rgb = inputImage.getRGB(x, y);
int blue = 0x0000ff & rgb;
int green = 0x0000ff & (rgb >> 8);
int red = 0x0000ff & (rgb >> 16);
int lum = (int) (red * 0.299 + green * 0.587 + blue * 0.114);
outputImage
.setRGB(x, y, lum | (lum << 8) | (lum << 16));
}
}
ImageIO.write(outputImage, "jpg", new File("output.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
它似乎你剛剛開始使用Java,我建議你從這裏http://www.herbschildt.com/whatsnew.htm參考Java Complete Reference,並特別閱讀圖像處理部分,你會發現你想要的東西 – Mihir
你有什麼操作可以在'byt'上做e []'數組取決於它存儲的格式。RGB位圖? ARGB位圖? JPG? – Patashu
@Patashu我的圖像從服務器下載爲base64字符串,然後使用Apache.commons庫中的Base64.decodeBase64()函數將它們轉換爲imageBytes。然後我使用fileoutputstream編寫它們,然後使用byteArrayInputStream在另一個函數中再次讀取。這些是需要改變的實際字節。 – user1900588