• 締切済み

ディザリングについて(java)

下記URLのようなディザリングをjavaのペイントプログラムに実装したいと考えています。 http://www40.atwiki.jp/spellbound/pages/269.html 4x4 ピクセルの元データをマトリックスの 4x4 それぞれと比較して画像を処理するという大まかな方針は理解できたのですが具体的な記述の仕方が分かりません 稚拙な質問で申し訳ありませんが御教授お願いいたします。m(_ _)m

みんなの回答

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.2

 #1です。  ディザリングをするだけのサンプルです。  まずは、ImageFilter です。  RGBImageFilter を継承して実装します。 public class DitheringImageFilter extends RGBImageFilter {   private Random random = new Random();   public DitheringImageFilter() {     canFilterIndexColorModel = true;   }   @Override   public int filterRGB(int x, int y, int rgb) {     int r = ((rgb & 0xFF0000) >> 16);     int g = ((rgb & 0xFF00) >> 8);     int b = (rgb & 0xFF);     int gray = (r + g + b) / 3;     if (gray < random.nextInt(256)) {       //黒、最初のFFはアルファ成分でFF固定       return 0xFF000000;     } else {       //白、同様にアルファ成分はFF       return 0xFFFFFFFF;     }   } }  そして、これを使ったメインのクラスです。  クラスファイルと同じフォルダにtest.jpgと言う名前の画像ファイルを用意してください。 public class MainFrame extends JFrame implements ActionListener {   JLabel canvas;   JButton dither;   Image image;   ImageFilter filter = new DitheringImageFilter();   public MainFrame() {     Container con = getContentPane();     con.setLayout(new BorderLayout());     URL url = this.getClass().getResource("test.jpg");     try {       image = ImageIO.read(url);     } catch (IOException ex) {       ex.printStackTrace();     }     canvas = new JLabel(new ImageIcon(image));     JScrollPane sp = new JScrollPane(canvas);     con.add(sp, BorderLayout.CENTER);     JPanel p = new JPanel();     dither = new JButton("ディザリング");     dither.addActionListener(this);     p.add(dither);     con.add(p, BorderLayout.SOUTH);     pack();   }   public void actionPerformed(ActionEvent e) {     FilteredImageSource fis = new FilteredImageSource(image.getSource(), filter);     image = createImage(fis);     canvas.setIcon(new ImageIcon(image));   }   public static void main(String[] args) {     SwingUtilities.invokeLater(new Runnable() {       public void run() {         MainFrame frame = new MainFrame();         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         frame.setVisible(true);       }     });   } }

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんにちは。  Java的には、ImageFilter を使うところだと思うのですが、その方針でいいのですか?  それとも、勉強のためにそのサイトのやり方にできるだけ沿って、自分で実装したいということですか?

rad_sp09
質問者

補足

ImageFilterを使うのが一般的だったようですね。 調べてみてアルゴリズムは大方理解出来ました。こちらの方針でお願いいたします。 以下のプログラミングにファイル読み込み、カラーパレット等を実装したものにディザリングを実装したいと考えています。 今手元にそのデータがないので↓は簡易版ですが載せました^^; import javax.swing.JPanel; import java.awt.Graphics; public class Panel extends JPanel { public void drawLine(int a, int b, int a2, int b2){ Graphics g = this.getGraphics(); g.drawLine(a, b, a2, b2); } } ------------------------ import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import javax.swing.JFrame; public class Paint extends JFrame implements MouseMotionListener { int x1=0, y1=0, x2, y2; Panel panel; public void mouseMoved(MouseEvent arg0) {} private void init() { this.setTitle("no title"); this.setSize(500, 500); this.addMouseMotionListener(this); panel=new Panel(); this.getContentPane().add(panel); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { SPaint frame=new Paint(); frame.init(); } }

関連するQ&A

専門家に質問してみよう