Java Scratch卡演示

Java Scratch卡演示,java,alpha-transparency,Java,Alpha Transparency,在Java中构建彩票刮刮卡应用程序。已经完成了分配,只需要在抓取功能方面得到帮助 程序基本上是这样工作的: 为背景创建图像(现在它只是一个白色背景,但后来显然是一个带有乐透符号的scratchcard图像) 创建卡_表面,它只是一个绿色的层,当被划伤时应该会显示后面的图像 onMouseDrawed()我使用笔划从当前鼠标坐标到新的鼠标坐标绘制一条线。我试着将Alphacomposite设置在这个笔划上,认为它会显示下面的图像。不幸的是,不是这样 谢谢你的帮助 import java.awt.

在Java中构建彩票刮刮卡应用程序。已经完成了分配,只需要在抓取功能方面得到帮助

程序基本上是这样工作的:

  • 为背景创建图像(现在它只是一个白色背景,但后来显然是一个带有乐透符号的scratchcard图像)
  • 创建卡_表面,它只是一个绿色的层,当被划伤时应该会显示后面的图像
  • onMouseDrawed()我使用笔划从当前鼠标坐标到新的鼠标坐标绘制一条线。我试着将Alphacomposite设置在这个笔划上,认为它会显示下面的图像。不幸的是,不是这样
  • 谢谢你的帮助

     import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.RenderingHints;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionAdapter;
    
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.ImageIcon;
    
    import java.awt.Stroke;
    import java.awt.BasicStroke;
    import java.awt.AlphaComposite;
    
    
    public class Main {
      public static void main(String[] args) {
        JFrame frame = new JFrame();
        final DrawPad drawPad = new DrawPad();
        frame.add(drawPad, BorderLayout.CENTER);
        JButton clearButton = new JButton("New Scratch-Card");
        clearButton.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            drawPad.clear();
          }
        });
        frame.add(clearButton, BorderLayout.SOUTH);
        frame.setSize(500, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
      }
    
    }
    class DrawPad extends JComponent {
      Image image;
      Image card_surface;
    
      Graphics2D graphics2D;
      int currentX, currentY, oldX, oldY;
    
    
    
      public DrawPad() {
        final Stroke stroke = new BasicStroke (17.0F, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL);
        //image = new ImageIcon("iPhone-4-Pattern-Wallpaper-07.jpg").getImage();
        setDoubleBuffered(false);
        addMouseListener(new MouseAdapter() {
          public void mousePressed(MouseEvent e) {
            oldX = e.getX();
            oldY = e.getY();
          }
        });
        addMouseMotionListener(new MouseMotionAdapter() {
          public void mouseDragged(MouseEvent e) {
            currentX = e.getX();
            currentY = e.getY();
            if (graphics2D != null){
          graphics2D.setStroke(stroke);
              graphics2D.setPaint(Color.GRAY);
              graphics2D.setComposite(makeComposite(0.5F));
              graphics2D.drawLine(oldX, oldY, currentX, currentY);
            repaint();
            oldX = currentX;
            oldY = currentY;
          }
    }
        });
      }
    private AlphaComposite makeComposite(float alpha) {
        int type = AlphaComposite.SRC_OVER;
        return(AlphaComposite.getInstance(type, alpha));
      }
     public void clear() {
        image=null;
        card_surface=null;
    
        repaint();
      }
      public void paintComponent(Graphics g) {
        if (image == null) {
    
          image = createImage(getSize().width, getSize().height);
          graphics2D = (Graphics2D) image.getGraphics();
          graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
              RenderingHints.VALUE_ANTIALIAS_ON);
    
    
    
        graphics2D.setPaint(Color.white);
            graphics2D.fillRect(0, 0, getSize().width, getSize().height);
            graphics2D.setPaint(Color.black);
    
        repaint();
    
        }
    
         if (card_surface == null) {
        card_surface = createImage(getSize().width, getSize().height);
            graphics2D = (Graphics2D) card_surface.getGraphics();
            graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
          RenderingHints.VALUE_ANTIALIAS_ON);   
    
        graphics2D.setPaint(Color.green);
            graphics2D.fillRect(0, 0, getSize().width, getSize().height);
    
        repaint();
    }
    
    
        g.drawImage(image, 0, 0, null);
        g.drawImage(card_surface, 0, 0, null);
    
      }
    
    
    }
    

    当用户“抓取”顶部图像时,您试图显示底层图像,对吗

    这里实际上需要两个图像:第一个是原始图像,第二个是空白图像,背景为灰色,覆盖第一个图像,将其隐藏。当用户“抓取”顶部图像时,您需要在灰色图像上绘制透明颜色,以显示底层图像

    因此,这些步骤是:

    用空白画出原始图像 当用户在顶部图像上用透明颜色“划伤”时 重新绘制图像,顶部图像现在具有透明部分 重复

    这听起来很复杂,但我不认为这太难,你只需要把两幅图像分开,然后用缓冲区把一幅画在另一幅上面。有关使用透明缓冲图像的信息,请参阅本文


    我希望这能有所帮助。

    好的,我们设法让基础工作正常进行

    我使用了来自Ewald的链接,谢谢伙计

    以下是工作代码(只需将“iphone4”图像路径更改为您选择的图像):

    导入java.awt.BorderLayout;
    导入java.awt.Color;
    导入java.awt.Graphics;
    导入java.awt.Graphics2D;
    导入java.awt.Image;
    导入java.awt.RenderingHints;
    导入java.awt.event.ActionEvent;
    导入java.awt.event.ActionListener;
    导入java.awt.event.MouseAdapter;
    导入java.awt.event.MouseEvent;
    导入java.awt.event.MouseMotionAdapter;
    导入javax.swing.JButton;
    导入javax.swing.JComponent;
    导入javax.swing.JFrame;
    导入javax.swing.ImageIcon;
    导入java.awt.image.buffereImage;
    导入java.awt.image.FilteredImageSource;
    导入java.awt.image.ImageFilter;
    导入java.awt.image.ImageProducer;
    导入java.awt.image.RGBImageFilter;
    导入java.awt.Toolkit;
    导入java.io.File;
    导入javax.imageio.imageio;
    导入java.awt.Stroke;
    导入java.awt.BasicStroke;
    导入java.awt.AlphaComposite;
    公共班机{
    公共静态void main(字符串[]args){
    JFrame=新JFrame();
    最终绘图板绘图板=新绘图板();
    添加(绘图板、边框布局、中心);
    JButton clearButton=新JButton(“新刮刮卡”);
    clearButton.addActionListener(新ActionListener(){
    已执行的公共无效操作(操作事件e){
    drawPad.clear();
    }
    });
    添加(clearButton,BorderLayout.SOUTH);
    框架。设置尺寸(500300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    }
    }
    类DrawPad扩展了JComponent{
    缓冲图像;
    缓冲图像卡表面;
    图形2d图形2d;
    int currentX,currentY,oldX,oldY;
    公共绘图板(){
    最终行程=新的基本行程(17.0F,基本行程.端盖\对接,基本行程.连接\斜角);
    setDoubleBuffered(假);
    addMouseListener(新的MouseAdapter(){
    公共无效鼠标按下(MouseEvent e){
    oldX=e.getX();
    oldY=e.getY();
    }
    });
    addMouseMotionListener(新的MouseMotionAdapter(){
    公共无效鼠标标记(鼠标事件e){
    currentX=e.getX();
    当前y=e.getY();
    if(graphics2D!=null){
    图2d.设定行程(行程);
    图形2d.setPaint(颜色为灰色);
    //graphics2D.setComposite(makeComposite(0.5F));
    图形2D.绘制线(oldX,oldY,currentX,currentY);
    重新油漆();
    oldX=当前x;
    oldY=当前;
    }
    }
    });
    }
    专用AlphaComposite makeComposite(浮点alpha){
    int type=AlphaComposite.SRC\u OVER;
    返回(AlphaComposite.getInstance(type,alpha));
    }
    私有图像转换颜色透明度(缓冲图像,颜色c1,颜色c2)
    {
    //原始测试,只是一个例子
    final int r1=c1.getRed();
    final int g1=c1.getGreen();
    最终int b1=c1.getBlue();
    final int r2=c2.getRed();
    final int g2=c2.getGreen();
    final int b2=c2.getBlue();
    ImageFilter过滤器=新的RGBImageFilter()
    {
    公共最终整型过滤器rgb(整型x、整型y、整型rgb)
    {
    int r=(rgb&0xFF0000)>>16;
    int g=(rgb&0xFF00)>>8;
    intb=rgb&0xFF;
    
    如果(r>=r1&&r=g1&&g=b1&&b,你需要告诉我们你的问题是什么。仅仅告诉你想做什么实际上没有太大帮助。告诉我们什么不起作用,哪些(如果有的话)你会遇到异常等。我不知道该怎么办。我试着用字母组合笔划来解开下面的图像。我还研究了剪裁下面的图像。代码编译并运行,所以没有异常。我想我真的不知道最好的方法,所以也许有人可以提出一些建议?好的,谢谢-我会看一看,然后回头见。我现在急需睡眠!太好了,我想它会起作用的,我几年前在一个游戏中做过类似的事情,所以理论是可靠的。实现会更复杂,但它肯定是可行的。啊,明白了。-我读了代码,可以看到这个工作!很好的一个帮助伙伴。很好,你还有一些工作要做,但是一旦你有了这个想法,就更容易实现了。祝你好运!下面看一看我制作的一个经过精心打磨的应用程序,它使用以下代码作为基础::()()()()()()()()()()())
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.RenderingHints;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionAdapter;
    
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.ImageIcon;
    import java.awt.image.BufferedImage;
    import java.awt.image.FilteredImageSource;
    import java.awt.image.ImageFilter;
    import java.awt.image.ImageProducer;
    import java.awt.image.RGBImageFilter;
    import java.awt.Toolkit;
    import java.io.File;
    import javax.imageio.ImageIO;
    
    import java.awt.Stroke;
    import java.awt.BasicStroke;
    import java.awt.AlphaComposite;
    
    
    public class Main {
      public static void main(String[] args) {
        JFrame frame = new JFrame();
        final DrawPad drawPad = new DrawPad();
        frame.add(drawPad, BorderLayout.CENTER);
        JButton clearButton = new JButton("New Scratch-Card");
        clearButton.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            drawPad.clear();
          }
        });
        frame.add(clearButton, BorderLayout.SOUTH);
        frame.setSize(500, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
      }
    
    }
    class DrawPad extends JComponent {
      BufferedImage image;
      BufferedImage card_surface;
    
      Graphics2D graphics2D;
      int currentX, currentY, oldX, oldY;
    
    
    
      public DrawPad() {
        final Stroke stroke = new BasicStroke (17.0F, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL);
    
        setDoubleBuffered(false);
        addMouseListener(new MouseAdapter() {
          public void mousePressed(MouseEvent e) {
            oldX = e.getX();
            oldY = e.getY();
          }
        });
        addMouseMotionListener(new MouseMotionAdapter() {
          public void mouseDragged(MouseEvent e) {
            currentX = e.getX();
            currentY = e.getY();
            if (graphics2D != null){
          graphics2D.setStroke(stroke);
              graphics2D.setPaint(Color.GRAY);
              //graphics2D.setComposite(makeComposite(0.5F));
              graphics2D.drawLine(oldX, oldY, currentX, currentY);
            repaint();
            oldX = currentX;
            oldY = currentY;
          }
    }
        });
      }
    private AlphaComposite makeComposite(float alpha) {
        int type = AlphaComposite.SRC_OVER;
        return(AlphaComposite.getInstance(type, alpha));
      }
     private Image TransformColorToTransparency(BufferedImage image, Color c1, Color c2)
      {
        // Primitive test, just an example
        final int r1 = c1.getRed();
        final int g1 = c1.getGreen();
        final int b1 = c1.getBlue();
        final int r2 = c2.getRed();
        final int g2 = c2.getGreen();
        final int b2 = c2.getBlue();
        ImageFilter filter = new RGBImageFilter()
        {
          public final int filterRGB(int x, int y, int rgb)
          {
            int r = (rgb & 0xFF0000) >> 16;
            int g = (rgb & 0xFF00) >> 8;
            int b = rgb & 0xFF;
            if (r >= r1 && r <= r2 &&
                g >= g1 && g <= g2 &&
                b >= b1 && b <= b2)
            {
              // Set fully transparent but keep color
              return rgb & 0xFFFFFF;
            }
            return rgb;
          }
        };
    
        ImageProducer ip = new FilteredImageSource(image.getSource(), filter);
          return Toolkit.getDefaultToolkit().createImage(ip);
      }
    private BufferedImage ImageToBufferedImage(Image image2, int width, int height)
      {
        BufferedImage dest = new BufferedImage(
            width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = dest.createGraphics();
        //g2.drawImage(image, 0, 0, null);
        g2.drawImage(image2, 0, 0, null);
        //g2.dispose();
        return dest;
      }
     public void clear() {
        image=null;
        card_surface=null;
    
        repaint();
      }
      public void paintComponent(Graphics g) {
    
    
    
     if (image == null) {
    
        image = new BufferedImage(500, 300, BufferedImage.TYPE_INT_ARGB);
        String imagePath = "iPhone-4-Pattern-Wallpaper-07.jpg";
        File inFile = new File(imagePath);
        try{
        image = ImageIO.read(inFile);
    }catch(java.io.IOException e){System.out.println(e);}
    
    
        graphics2D = image.createGraphics();
    
          //image = new ImageIcon().getImage("");
          //image = createImage(getSize().width, getSize().height);
          //graphics2D = (Graphics2D) image.getGraphics();
          graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
              RenderingHints.VALUE_ANTIALIAS_ON);
    
    
    
        //graphics2D.setPaint(Color.white);
           // graphics2D.fillRect(0, 0, getSize().width, getSize().height);
           // graphics2D.setPaint(Color.black);
    
        repaint();
    
        }
    
         if (card_surface == null) {
        card_surface = new BufferedImage(500, 300, BufferedImage.TYPE_INT_ARGB);
            graphics2D = (Graphics2D) card_surface.getGraphics();
            graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
          RenderingHints.VALUE_ANTIALIAS_ON);   
    
        graphics2D.setPaint(Color.green);
            graphics2D.fillRect(0, 0, getSize().width, getSize().height);
    
        repaint();
    }
    
    
        g.drawImage(image, 0, 0, null);
        g.drawImage(card_surface, 0, 0, null);
        Image transpImg2 = TransformColorToTransparency(card_surface, new Color(0, 50, 77), new Color(200, 200, 255));
        BufferedImage resultImage2 = ImageToBufferedImage(transpImg2, image.getWidth(), image.getHeight());
        g.drawImage(image, 0, 0, null);
        g.drawImage(resultImage2, 0, 0, null); 
    
       /* File outFile2 = new File("map_with_transparency2.png");
        try{
        ImageIO.write(resultImage2, "PNG", outFile2);
        }catch(Exception e){System.out.println(e);}
        //card_surface = (BufferedImage)transpImg2;
        */
      }
    
    
    }