如何从PNG文件中读取像素?

我知道如何使用Robot,Windowtester或FEST捕获屏幕截图。 我也知道如何使用机器人从屏幕上读取像素。

int x = 10; int y = 10; Color px = getPixelColor(int x, int y); 

但是,我不知道如何从已捕获的图像中读取像素。 我打算将当前图像与文件中的图像进行比较。 让我们说两者都是PNG。 是否有任何框架可用于逐像素地比较图像?

这是用Java吗? 如果是这样,您可以使用ImageIO.read( "yourImage.png" )来获取BufferedImage 。 这将有一个getData()方法,它将为您提供一个Raster对象,您可以在其上调用getPixel 。 见链接

这应该工作:

 javax.imageio.ImageIO.read(new File("filename.png")) 

然后,您可以遍历像素并逐个像素地与图像进行比较:

 java.awt.image.BufferedImage.getRGB(int x, int y). 

您可以阅读图像文件: 读取/加载图像 。

然后使用getRGB方法获取颜色。

将它们作为BufferedImage实例加载,相对容易。

以下是使用文本创建图像的代码的一部分,然后创建一个新图像,显示带有和不带文本的图像之间的差异。

 for (int xx=0; xx 

Screensot

完整代码

 import java.awt.image.BufferedImage; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.imageio.*; import java.io.*; import javax.imageio.stream.ImageOutputStream; import javax.imageio.plugins.jpeg.JPEGImageWriteParam; import java.util.Locale; class ImageWriteTest { private BufferedImage originalImage; private BufferedImage textImage; private BufferedImage differenceImage; private BufferedImage bnwImage; private JPanel gui; private JCheckBox antialiasing; private JCheckBox rendering; private JCheckBox fractionalMetrics; private JCheckBox strokeControl; private JCheckBox colorRendering; private JCheckBox dithering; private JComboBox textAntialiasing; private JComboBox textLcdContrast; private JLabel label0_1; private JLabel label0_4; private JLabel label0_7; private JLabel label1_0; private JTextArea output; final static Object[] VALUES_TEXT_ANTIALIASING = { RenderingHints.VALUE_TEXT_ANTIALIAS_OFF, RenderingHints.VALUE_TEXT_ANTIALIAS_ON, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HBGR, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VBGR, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VRGB }; final static Object[] VALUES_TEXT_LCD_CONTRAST = { new Integer(100), new Integer(150), new Integer(200), new Integer(250) }; ImageWriteTest() { int width = 280; int height = 100; gui = new JPanel(new BorderLayout(0,4)); originalImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); textImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); differenceImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); bnwImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); JPanel controls = new JPanel(new GridLayout(0,2,0,0)); antialiasing = new JCheckBox("Anti-aliasing", false); rendering = new JCheckBox("Rendering - Quality", true); fractionalMetrics = new JCheckBox("Fractional Metrics", true); strokeControl = new JCheckBox("Stroke Control - Pure", false); colorRendering = new JCheckBox("Color Rendering - Quality", true); dithering = new JCheckBox("Dithering", false); controls.add(antialiasing); controls.add(rendering); controls.add(fractionalMetrics); controls.add(colorRendering); textLcdContrast = new JComboBox(VALUES_TEXT_LCD_CONTRAST); JPanel lcdContrastPanel = new JPanel(new FlowLayout(FlowLayout.LEADING)); lcdContrastPanel.add(textLcdContrast); lcdContrastPanel.add(new JLabel("Text LCD Contrast")); controls.add(lcdContrastPanel); controls.add(strokeControl); textAntialiasing = new JComboBox(VALUES_TEXT_ANTIALIASING); controls.add(textAntialiasing); controls.add(dithering); ItemListener itemListener = new ItemListener(){ public void itemStateChanged(ItemEvent e) { updateImages(); } }; antialiasing.addItemListener(itemListener); rendering.addItemListener(itemListener); fractionalMetrics.addItemListener(itemListener); strokeControl.addItemListener(itemListener); colorRendering.addItemListener(itemListener); dithering.addItemListener(itemListener); textAntialiasing.addItemListener(itemListener); textLcdContrast.addItemListener(itemListener); Graphics2D g2d = originalImage.createGraphics(); GradientPaint gp = new GradientPaint( 0f, 0f, Color.red, (float)width, (float)height, Color.orange); g2d.setPaint(gp); g2d.fillRect(0,0, width, height); g2d.setColor(Color.blue); for (int ii=0; ii 

在C / C ++中,如果您觉得需要最低版本的Windows,这很容易,您可以使用GDI +加载图像并将其绘制到内存位图,然后您可以使用返回的指针来获取像素数据。

使用GdiplusStartup()GdiplusShutdown()来初始化和取消初始化GDI +。

使用GDI + Image对象,使用带有文件名的重载来加载图像,然后使用方法GetWidth()GetHeight()BITMAPINFO结构和CreateDIBSection() GDI函数来创建内存位图。

然后使用CreateCompatibleDC()为位图创建设备上下文,使用SelectObject()将位图选择到该设备上下文中。

然后使用GDI + Graphics对象,使用带有设备上下文的重载,使用DrawImage()方法,使用带有xywidthheight的重载将图像绘制到位图的设备上下文。

之后,您可以使用CreateDIBSection()返回的指针获取/设置像素数据。

完成后,使用DeleteDC()删除位图的设备上下文,然后使用DeleteObject()来删除位图。 GDI + Image对象也可用于以支持的格式保存图像,包括PNG。