2014-02-01 4 views
-1

В настоящее время я делаю программу рисования, и в настоящее время я использую резиновый инструмент (версия, которая работает с альфа-цветами). Проблема в том, что я не могу нарисовать невидимые строки с помощью события mouseDragged, потому что они просто вернутся к картине, которая была там раньше ...Java - Rubber alpha function

Я рассмотрел setRGB на bImg, но его нужно будет поддерживать mouseDragged, а также сделать толщину переменной линии. У кого-нибудь есть идеи?

EDIT: Почему подавляющее большинство голосов?

+0

я не знаю. Я не спустил тебя вниз. Вот +1, так что вам не стыдно пытаться учиться. – CodeMed

+1

Спасибо! Я не знаю, почему программирование «экспертов» не может дать нам новичков перерыв ... – gedr

+1

не против downvotes, они так же несущественны, как reddit karma –

ответ

1

Вы можете преобразовать ваше изображение в writeableraster и использовать методы getpixel() и setpixel() для преобразования цветов под указателем мыши при определенных условиях.

+0

Спасибо, но могу ли я применить толщину к этому методу? – gedr

+0

Этот подход потребует, чтобы вы катили свою собственную толщину, применяя любые цветовые операции к заданному числу пикселей по обе стороны пикселя, на который пользователь щелкает. Может потребоваться немного кодирования, но он может работать. – CodeMed

2

downwote может быть связано с тем, что не совсем понятно, что вы пытаетесь для того чтобы достигнуть, и как вы уже пробовали.

Я предполагаю, что вы хотите нарисовать линии над своим изображением в mouseDragged. Эти строки должны иметь эффект «резиновый»/«ластик», удаляя некоторые из ранее окрашенных пикселей или (когда вы говорите, что хотите иметь значение альфа), возможно, не , удаляя их, а просто делая их более бледный. Изменение значений пикселей вручную с помощью setRGB не является опцией, потому что этот резиновый эффект должен иметь толщину , которую вы, вероятно, выбрали, установив 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). Вы можете попробовать разные варианты для достижения разных «резиновых эффектов», в зависимости от значения альфа, которое имеют стертые пиксели, и в зависимости от значения альфа, которое вы задали для «резинового цвета».

EDIT: пример, ... может быть, вы должны описать проблему более четко

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

Пробовал aComposite, не работал; В настоящее время я тестирую растровый метод. Thansk за помощь, хотя. – gedr

+0

Добавлен пример, возможно, вы можете описать, что вы хотите достичь автоматически .... – Marco13

+0

Этот код неверен, так как вы не можете использовать строку с альфа-значением, чтобы нарисовать непрозрачный. В любом случае проблема решена. – gedr