Java Scratch Card демо - PullRequest
       8

Java Scratch Card демо

0 голосов
/ 29 декабря 2011

Создание приложения для лотереи на 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);

  }


}

Ответы [ 2 ]

4 голосов
/ 29 декабря 2011

Что вы пытаетесь сделать, это показать основное изображение, когда пользователь «поцарапает» верхнее изображение, верно?

Вам на самом деле нужны два изображения: во-первых, исходное изображение, а во-вторых, пустое изображение с серым фоном, которое проходит над первым изображением, скрывая его. Когда пользователь «царапает» верхнее изображение, вам нужно нарисовать прозрачным цветом ПО серому изображению, открывая базовое изображение.

Итак, шаги:

Нарисуйте оригинал с надписью Когда пользователь «царапает» рисовать прозрачным цветом на верхнем изображении Перекрасьте изображения, чтобы верхнее изображение имело прозрачные участки Повторить

Звучит сложно, но я не думаю, что это будет слишком сложно, вам просто нужно разделить два изображения и закрасить одно поверх другого с помощью буфера. См. Этот пост Как сделать цвет прозрачным в BufferedImage и сохранить как PNG для получения информации о работе с прозрачными буферизованными изображениями.

Надеюсь, это поможет.

0 голосов
/ 30 декабря 2011

ОК удалось заставить основы работать,

Я использовал ссылку от Эвальда, спасибо, приятель!

Вот рабочий код (просто измените путь к изображению «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;
    */
  }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...