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