我有一個RGB bufferedImage bImg。
我想將bImg轉換爲灰色圖像。將RGB圖像轉換爲灰度圖像減少了java中的內存
BufferedImage grayIm=new BufferedImage(bImg.getWidth(null), bImg.getHeight(null), BufferedImage.TYPE_BYTE_GRAY);
我試過這個grayIm,但是我不能設置這個grayIm的灰度值。
我有一個RGB bufferedImage bImg。
我想將bImg轉換爲灰色圖像。將RGB圖像轉換爲灰度圖像減少了java中的內存
BufferedImage grayIm=new BufferedImage(bImg.getWidth(null), bImg.getHeight(null), BufferedImage.TYPE_BYTE_GRAY);
我試過這個grayIm,但是我不能設置這個grayIm的灰度值。
一種方式可以是色彩空間(表現欠佳)轉換:
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp op = new ColorConvertOp(cs, null);
BufferedImage image = op.filter(bufferedImage, null);
另一個辦法是使用一個BufferedImage,因爲你做的(更好的性能):
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_BYTE_GRAY);
Graphics g = image.getGraphics();
g.drawImage(colorImage, 0, 0, null);
g.dispose();
最後並非最不重要的,最佳性能是使用一GrayFilter:
ImageFilter filter = new GrayFilter(true, 50);
ImageProducer producer = new FilteredImageSource(colorImage.getSource(), filter);
Image mage = Toolkit.getDefaultToolkit().createImage(producer);
源:http://www.codebeach.com/2008/03/convert-color-image-to-gray-scale-image.html
編輯:per Mark的評論。
在第三種方法中,未定義createImage。 'this'應該是'Toolkit.getDefaultToolkit()' – 2014-06-12 10:06:14
第三個實現比下面的解決方案有更好的性能嗎? – 2015-08-27 14:05:05
注意:這不是什麼OP要求(因爲它不減少內存使用量),但我會離開這裏,因爲人們喜歡這個手冊每個象素的方法。
這很簡單。這個想法是遍歷圖像的每個像素,並將其更改爲灰度等效。
public static void makeGray(BufferedImage img)
{
for (int x = 0; x < img.getWidth(); ++x)
for (int y = 0; y < img.getHeight(); ++y)
{
int rgb = img.getRGB(x, y);
int r = (rgb >> 16) & 0xFF;
int g = (rgb >> 8) & 0xFF;
int b = (rgb & 0xFF);
int grayLevel = (r + g + b)/3;
int gray = (grayLevel << 16) + (grayLevel << 8) + grayLevel;
img.setRGB(x, y, gray);
}
}
但是,這並不減少內存。要有效減少內存使用量,請執行相同的過程,但使用灰度BufferedImage作爲輸出。
但是這會減少內存@Martijn Courteaux – 2012-02-03 16:26:04
實際上,灰度轉換不是R,G和B通道的簡單平均值,因爲藍色對我們的亮度感知貢獻最小,而綠色貢獻最多。爲了精確表示灰度圖像中的光強度,需要加權平均值。使用0.2126R + 0.7152G + 0.0722B – 2015-12-29 13:11:03
@ Mr.WorshipMe:太棒了!我意識到這種現象。你的重量上的任何資源? – 2015-12-29 22:39:56
我有同樣的問題。您選擇的解決方案不僅取決於性能水平。還有必要了解你努力提高的圖像質量。請看這些例子。他們都維護源代碼。 http://codehustler.org/blog/java-to-create-grayscale-images-icons/
可能的複製 - http://stackoverflow.com/questions/6471340/how-do-i-desaturate-a-bufferedimage-in-java/6471524#6471524 – mre 2012-02-03 16:11:57
是什麼_「我無法設置灰度這greyIm的值「_是什麼意思? – 2012-02-03 16:12:09