Java-Rubber alpha function

问题描述 投票:-1回答:3

我目前正在制作一个绘画程序,并且目前正在实现一个橡胶工具(一种可以处理Alpha颜色的版本)。问题是,我无法通过mouseDragged事件绘制不可见的线条,因为它们只会出现在之前的绘画之上...

我已经在bImg上考虑了setRGB,但是它需要有mouseDragged支持,并且还要使线的粗细可变。任何人有任何想法吗?

编辑:为什么要投反对票?

java graphics alpha graphics2d
3个回答
1
投票

您可以在某些条件下将图像转换为writeableraster,并使用getpixel()和setpixel()方法转换用户鼠标指针下方的颜色。


2
投票

下降的现象可能与以下事实有关:您尝试达到的目标并不完全清楚[[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(); } }


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.