Большинство графических форматов имеют информацию заголовка до пиксельных данных, поэтому, когда вы читаете эти типы файлов, вы должны принять это во внимание ...
Честно говоря, это гораздо проще полагаться по существующей библиотеке, где вы можете.
ImageIO
позволяет вам читать и записывать несколько различных форматов файлов, включая BMP.
Взгляните на
Следующее решение - вы преобразовать изображение самостоятельно или использовать уже существующий фильтр. Вы должны будете сделать некоторые из ваших собственных показателей, но и в прошлом, я нашел манипуляцию пикселя изображения будет медленно, медленнее, чем в застроенных фильтрах по крайней мере ...
Оригинал, ручной оттенки серого, автоматический/фильтр полутоновой
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class GrayScaleImage {
public static void main(String[] args) {
new GrayScaleImage();
}
public GrayScaleImage() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridLayout(0, 3));
try {
BufferedImage master = ImageIO.read(new File("/path/to/file.bmp"));
BufferedImage gray = ImageIO.read(new File("/path/to/file.bmp"));
// Manual manipulation...
for (int x = 0; x < gray.getWidth(); x++) {
for (int y = 0; y < gray.getHeight(); y++) {
Color color = new Color(gray.getRGB(x, y));
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();
red = green = blue = (int)(red * 0.299 + green * 0.587 + blue * 0.114);
color = new Color(red, green, blue);
int rgb = color.getRGB();
gray.setRGB(x, y, rgb);
}
}
BufferedImage grayScale = ImageIO.read(new File("/path/to/file.bmp"));
// Automatic converstion....
ColorConvertOp op = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
op.filter(grayScale, grayScale);
add(new JLabel(new ImageIcon(master)));
add(new JLabel(new ImageIcon(gray)));
add(new JLabel(new ImageIcon(grayScale)));
} catch (IOException ex) {
Logger.getLogger(GrayScaleImage.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
Теперь, записывая изображение (которое не показано выше) будет столь же просто, как ...
ImageIO.write(grayScale, "BMP", new File("/path/to/grayscale file.bmp"));
Это обеспечит очень светлое (или даже полностью белое) изображение для изображений с красным цветом и очень темные изображения (или даже черные), где нет красного цвета.Например, изображение CYAN (зеленый + синий) будет черным. Это не так, как работает шкала серого. – afk5min