我目前正在制作一个绘画程序,并且目前正在实现一个橡胶工具(一种可以处理Alpha颜色的版本)。问题是,我无法通过mouseDragged事件绘制不可见的线条,因为它们只会出现在之前的绘画之上...
我已经在bImg上考虑了setRGB,但是它需要有mouseDragged支持,并且还要使线的粗细可变。任何人有任何想法吗?
编辑:为什么要投反对票?
您可以在某些条件下将图像转换为writeableraster,并使用getpixel()和setpixel()方法转换用户鼠标指针下方的颜色。
下降的现象可能与以下事实有关:您尝试达到的目标并不完全清楚[[what,而您已经尝试过how。
我假设您想在mouseDragged
中的图像上画线。这些行应具有“橡胶” /“橡皮擦”的作用,删除一些以前绘制的像素,或者(当您说要具有alpha值时),也许不removing
它们,而只是使它们更加苍白。不能使用setRGB手动更改像素值,因为这种橡胶效果应该具有一定的[[thickness,您可能需要在调用graphics.setStroke(new BasicStroke(thickness))
之前设置graphics.draw(rubberLine)
来选择。 如果这都是正确的,那么您可能必须使用http://docs.oracle.com/javase/6/docs/api/java/awt/Graphics2D.html#setComposite%28java.awt.Composite%29设置适当的组合。特别是,您将必须设置AlphaComposite(http://docs.oracle.com/javase/6/docs/api/java/awt/AlphaComposite.html)。您可以尝试不同的方法,以实现不同的“橡胶效果”,具体取决于已擦除像素具有的alpha值,以及为“橡胶颜色”设置的alpha值。 编辑:一个例子,...也许您应该更清楚地描述问题import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Line2D;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class SimplePaint
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
createAndShowGUI();
}
});
}
private static void createAndShowGUI()
{
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
PaintPanel paintPanel = new PaintPanel();
f.getContentPane().setLayout(new BorderLayout());
f.getContentPane().add(
createControlPanel(paintPanel), BorderLayout.NORTH);
f.getContentPane().add(paintPanel, BorderLayout.CENTER);
f.setSize(500,500);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
static JPanel createControlPanel(final PaintPanel paintPanel)
{
JPanel controlPanel = new JPanel(new GridLayout(0,2));
final JLabel label = new JLabel("Paint");
final JSlider slider = new JSlider(0, 255, 0);
slider.addChangeListener(new ChangeListener()
{
@Override
public void stateChanged(ChangeEvent e)
{
int value = slider.getValue();
if (value <= 0)
{
label.setText("Paint");
}
else
{
label.setText("Rubber alpha "+value);
}
paintPanel.setRubber(value);
}
});
controlPanel.add(label);
controlPanel.add(slider);
return controlPanel;
}
}
class PaintPanel extends JPanel implements MouseMotionListener
{
private BufferedImage image;
private Point previousPoint = new Point();
private int rubberAlpha = -1;
PaintPanel()
{
addMouseMotionListener(this);
}
void setRubber(int alpha)
{
this.rubberAlpha = alpha;
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
int w = getWidth();
int h = getHeight();
if (image == null)
{
image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics imageG = image.getGraphics();
imageG.setColor(Color.WHITE);
imageG.fillRect(0, 0, w, h);
imageG.dispose();
}
else if (image.getWidth() != w || image.getHeight() != h)
{
BufferedImage newImage =
new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics imageG = newImage.getGraphics();
imageG.drawImage(image, 0, 0, null);
imageG.dispose();
image = newImage;
}
g.drawImage(image, 0, 0, null);
}
@Override
public void mouseDragged(MouseEvent e)
{
if (image == null)
{
return;
}
Graphics2D g = (Graphics2D)image.getGraphics();
g.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
if (rubberAlpha > 0)
{
g.setColor(new Color(255,255,255,rubberAlpha));
Line2D line = new Line2D.Double(previousPoint, e.getPoint());
g.setStroke(new BasicStroke(20,
BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
g.draw(line);
}
else
{
g.setColor(new Color(255,0,0,255));
Line2D line = new Line2D.Double(previousPoint, e.getPoint());
g.setStroke(new BasicStroke(20,
BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
g.draw(line);
}
g.dispose();
repaint();
previousPoint = e.getPoint();
}
@Override
public void mouseMoved(MouseEvent e)
{
previousPoint = e.getPoint();
}
}