如何从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()
方法,使用带有x
, y
, width
和height
的重载将图像绘制到位图的设备上下文。
之后,您可以使用CreateDIBSection()
返回的指针获取/设置像素数据。
完成后,使用DeleteDC()
删除位图的设备上下文,然后使用DeleteObject()
来删除位图。 GDI + Image对象也可用于以支持的格式保存图像,包括PNG。