2011-12-29 47 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