How do I flip an image horizontally flip with glReadPixels() Bufferedimage and out put with ImageIO?

前端 未结 2 1242
迷失自我
迷失自我 2020-12-19 13:15

How do I flip an Screenshot image? I can\'t find my problem anywhere else.
Example code:

/*
*@param fileLoc //Location of fileoutput destination
*@param f         


        
相关标签:
2条回答
  • 2020-12-19 14:01

    It's worth noting that it might be faster to simply read the pixels out of the buffer in the order you want them, rather than read them backwards and do a costly transform operation. Additionally, since you know for sure that the BufferedImage is TYPE_INT_RGB it should be safe to write directly into its raster.

    ByteBuffer fb = BufferUtils.createByteBuffer(WIDTH * HEIGHT * 3);
    BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
    glReadPixels(0, 0, WIDTH, HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, fb);
    int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
    for (int i = pixels.length - 1; i >= 0; i--) {
        int x = i % WIDTH, y = i / WIDTH * WIDTH;
        pixels[y + WIDTH - 1 - x] = (fb.get() & 0xff) << 16 | (fb.get() & 0xff) << 8 | fb.get() & 0xff;
    }
    
    0 讨论(0)
  • 2020-12-19 14:03

    E.G. of flipping an image horizontally using an AffineTransform.

    flipping an image horizontally

    import java.awt.*;
    import java.awt.geom.AffineTransform;
    import java.awt.image.BufferedImage;
    import javax.swing.*;
    
    public class Test001 {
    
        public static BufferedImage getFlippedImage(BufferedImage bi) {
            BufferedImage flipped = new BufferedImage(
                    bi.getWidth(),
                    bi.getHeight(),
                    bi.getType());
            AffineTransform tran = AffineTransform.getTranslateInstance(bi.getWidth(), 0);
            AffineTransform flip = AffineTransform.getScaleInstance(-1d, 1d);
            tran.concatenate(flip);
    
            Graphics2D g = flipped.createGraphics();
            g.setTransform(tran);
            g.drawImage(bi, 0, 0, null);
            g.dispose();
    
            return flipped;
        }
    
        Test001(BufferedImage bi) {
            JPanel gui = new JPanel(new GridLayout(1,2,2,2));
    
            gui.add(new JLabel(new ImageIcon(bi)));
            gui.add(new JLabel(new ImageIcon(getFlippedImage(bi))));
    
            JOptionPane.showMessageDialog(null, gui);
        }
    
        public static void main(String[] args) throws AWTException {
            final Robot robot = new Robot();
            Runnable r = new Runnable() {
    
                @Override
                public void run() {
                    final BufferedImage bi = robot.createScreenCapture(
                            new Rectangle(0, 360, 200, 100));
                    new Test001(bi);
                }
            };
            SwingUtilities.invokeLater(r);
        }
    }
    
    0 讨论(0)
提交回复
热议问题