2011-12-29 45 views
-2

用Java构建乐透刮刮卡应用程序。完成它的分配,只需要抓取功能的帮助。Java刮刮卡演示

基本程序是这样的:

  1. 创建图像为背景(现在它只是一个白色背景,但后来显然是与乐透符号的刮刮卡的图像)
  2. 创建card_surface这只是一个绿色的层,而不是在划伤后显露背后的图像。
  3. onMouseDragged()我用笔画从当前的鼠标坐标绘制一条线到较新的鼠标坐标。我试图在这个笔画上设置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); 

    } 


} 
+0

你需要告诉我们你的问题是什么。说出你想做的事实际上并没有太多的帮助。告诉我们什么是行不通的,哪些(如果有)异常等等。 – 2011-12-29 08:19:19

+0

我不知道从哪里去。我尝试使用Alphacomposite笔画揭开下面的图像。我还研究了剪下下面的图像。代码编译和运行,所以没有例外。我想我真的不知道做到这一点的最佳方式,所以也许有人可以提出一些建议? – aubreybourke 2011-12-29 08:31:49

回答

4

你正在尝试做的是露出下面的图像,当用户“划痕”最上面的图片,是否正确?

实际上,您需要两张图像:首先,原始图像,其次是灰色背景的空白图像覆盖第一张图像。当用户“划伤”顶部图像时,您需要在灰色图像上以透明颜色进行绘制,以显示底层图像。

所以步骤是:

在它与空白绘制原始图像 当用户“划痕”与顶部图像 上的透明彩色平局重画的图像,与现在的顶部图像具有透明部 重复

听起来很复杂,但我不认为它会太难,你只需要保持两个图像分开,并使用缓冲区来绘制一个。有关处理透明缓冲图像的信息,请参阅此帖How to make a color transparent in a BufferedImage and save as PNG

我希望这会有所帮助。

+0

好的谢谢 - 我会再看看,稍后再回复。我现在非常需要睡眠! – aubreybourke 2011-12-29 09:08:04

+0

太好了,我认为它会起作用,我在一场比赛中做了类似这样的事情,所以理论是坚实的。实施会更棘手,但它绝对是可行的。 – Ewald 2011-12-29 09:17:10

+0

啊,知道了.-我读了代码,可以看到这个工作!对帮助队友来说不错。 – aubreybourke 2011-12-29 10:19:27

0

好管理得到的基本工作,

我用Ewald的链接,谢谢队友!

这里是工作的代码(只是“iphone4的”映像路径更改为您所选择的图像):

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; 
    */ 
    } 


} 
+0

下面是我使用此代码作为基础的一个精心打磨的应用程序:http://www.splashportal.net/scratchCard/ :)))))))) – aubreybourke 2011-12-30 11:23:41