• 締切済み

ディザリングについて(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

  • Javaのダブルバッファリングについてお伺いしたいのですが、

    Javaのダブルバッファリングについてお伺いしたいのですが、 Thred.sleep(20) ペイント部 public void paint(Graphics g) { g.drawImage(wbuffer, int x, int y, this); } アップデートメソッド public void update(Graphics g) { paint(g); } 他のクラスからもこのwbufferの中にいったん書き込むようにしています。 チラつきが出る要因として考えられるのはどんなことがあるのでしょうか? ・オブジェクトの数が多い というのが原因でしょうか。 だいたい5秒おきくらいにチラつきが生じます。

    • ベストアンサー
    • Java
  • 6x6ぼかしマスクをかけるプログラムを作りたい。画像処理の専門書に「6

    6x6ぼかしマスクをかけるプログラムを作りたい。画像処理の専門書に「62x62ピクセルの2値画像(内四方2ピクセルは余白領域)があり、それに6x6ドットのぼかしマスクを2ドットずつオーバーラップさせることで、15x15ピクセルの標本化パターンを作成する」との記述がありました。 3x3ドットによる画像のフィルタリングプログラム例は探せば見つかるのですが、偶数倍フィルターにおいてはどのように実装すればよいかがピンときません。プログラムの参考例を教えて欲しいです。

  • Javaプログラムからバッチ起動

    Runtimeクラスを使用し、バッチファイルをJavaプログラム内で呼び出す処理を実装しました。Javaにより呼び出されるバッチファイル(X.bat)は、他の2つのバッチファイル(A.bat、B.bat)を呼び出すようにプログラムされています。ここで質問なのですが、実際にこのJavaプログラムを実行しX.batを呼び出し、最終的にA.bat、B.batが呼ばれているかどうかの確認をしたところ、どうもB.batが呼ばれずにA.bat終了後、処理が終了してしまっているなのですが、この原因についてご教授いただきたく質問いたしました。

    • ベストアンサー
    • Java
  • Java環境変数について。お願い事です。

    いつも大変お世話になりありがとうございます。 ボクのコンピューターはprintscreenが できません。言葉で質問します。 一時は環境変数java -versionで正常でしたが C:\User\jump7のあと、 1.jump7のユーザー環境変数 2.システム環境変数 が解らなくなりました。 かなり情けない話で申し訳ありませんが、 色々やっているうちに訳解らなくなって Java Kidなども全てZeroベースでやり直しました。 でも理屈を解ってないから乱れてきました。 下記3項目教えて欲しいのです。 1.ダウンロードするJavaのURL 2.jump7のユーザー環境変数 C:\User\jump7のあと、 3.システム環境変数 OSはWindows 10 HOME EDITIONを使っております。 プロセッサ Intel(R) Celeron(R) CPU G3900 @ 2.80GHz 2.81GHz 実装メモリ(RAM) 4.0GB 64bit operation system x64ベース プロセッサ すみません。いつも頼りっきりで。 何回もtryしましたが、今日はギブアップです。 明日やっても同じ結果でしょう。 理屈を教えて下さったら出来るかもしれません。 あまりムキになってコンピューターをやると 生活が乱れるので、もう休みます。 他力本願で申し訳ありません。 普段は自分が休む事はできないのですが どこを検索しても、いいURLがないので もう休みます。 すみませんが、ご回答のほど宜しくお願い申し上げます。

    • ベストアンサー
    • Java
  • java ダブルバッファリングするがちらつく

    javaでゲームをつくろうかと考えています。 そこで、ダブルバッファリングを実装したのですが、ちらついてしまいます。 いろいろ検索をかけて調べたのですが、これ以上改善が見込めないので 質問します。 以下がソースコードです。 画面がちらつくので、画面のリフレッシュレートが関係しているのかわからず、 しかし、ふつうにjava applet でゲームがあるので、多分どこかが間違っていると思います。 ご指摘をお願いします。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.net.URL; /*<applet code="applet01" width="320" height="480"></applet>*/ public class applet01 extends Applet implements KeyListener, Runnable { String text = ""; Image image; int x = 100, y = 100; KeyInput key; Image image弾; Bullet bullet; int flag_x = 1; Image backbuffer; Graphics ct; Dimension dim; // 初期化 public void init() { // image = getImage( getDocumentBase(), "test.jpg" ); image = getImage( getCodeBase(), "test.jpg" ); image弾 = getImage( getCodeBase(), "弾.jpg" ); bullet = new Bullet(); key = new KeyInput(); dim = getSize(); backbuffer = createImage( dim.width, dim.height ); ct = backbuffer.getGraphics(); Thread th = new Thread( this ); th.start(); addKeyListener( this ); requestFocus(); } // public void run() { try { while(true) { repaint(); Thread.sleep(1000/60); if( x>640 ) flag_x = 1; if( x<0 ) flag_x = 0; if( 1 == flag_x ) x--; if( 0 == flag_x ) x++; } } catch( Exception err ) { } } // 描画 public void paint( Graphics g ) { ct.setColor( Color.white ); ct.fillRect( 0, 0, dim.width, dim.height ); ct.setColor( Color.red ); ct.fillRect( (dim.width/2)-50 , (dim.height/2)-50, x, y ); // 裏画面に描画 ct.drawString( "画面をクリックしてキーボードで操作できます。", 0, 20 ); ct.drawString( "Hello from Java!", 60, 100 ); ct.drawImage( image, x, y, this ); bullet.Draw( ct, this, image弾 ); // 裏画面を表に反映 g.drawImage( backbuffer, 0, 0, this ); } // キーの入力があったとき public void keyTyped( KeyEvent e ) { repaint(); } // キーが押されたとき public void keyPressed( KeyEvent e ) { key.keyPressed( e ); if( key.isPressing( KeyEvent.VK_UP ) ) y = y - 5; if( key.isPressing( KeyEvent.VK_DOWN ) ) y = y + 5; if( key.isPressing( KeyEvent.VK_LEFT ) ) x = x - 5; if( key.isPressing( KeyEvent.VK_RIGHT ) ) x = x + 5; if( KeyEvent.VK_UP == e.getKeyCode() ) y = y - 5; if( KeyEvent.VK_Z == e.getKeyCode() ) { bullet.x = x; bullet.y = y; } repaint(); } // キーが放されたとき public void keyReleased( KeyEvent e ) { key.keyReleased( e ); } }

    • ベストアンサー
    • Java
  • 日付への変換

    最近javaを始めて、javaでホームページの最終更新時間のチェックプログラムを作ってみたくて、Swingを使ってチマチマ試しているのですが (1):URLクラスでgetLastModified()を使ってホームページから取得した値をdate型に変換 (2):tableに入れておいた日付データをStringで取り出してdate型に変換 (3):(1)と(2)を比較して大きい方をtableに戻す という感じのを考えてプログラムを作っていたところ、(1)で詰まってしまいました。 何かいい方法はないでしょうか?

    • ベストアンサー
    • Java
  • JAVAのプログラミングについて質問があります。

    私は今、javaのGUIのAWTについてのプログラミング問題で頭を抱えています。自分でも一応考えてみたのですが1週間やってみましたが歯がたちません。お忙しいところ恐縮なのですが問題の答えを示してもらえると大変助かります。以下が問題文です。「1953×2250pixelの画像を以下の方法で描画するプログラムを作成しなさい。 配列pixelcolor[1953][2250]に0から254までの値が与えられている。0を黒、254を白、その中間は値が大きくなるほど白に近づくグレーとし、配列pixelcolor(x.y)の値からpixel(x.y)を描画する。」 どうかお願いいたします。

    • ベストアンサー
    • Java
  • ALIENWARE X51のスタンダードでマイクラ

    ALIENWARE X51でマインクラフト(mod有り)はできますか? PC初心者なのでスペックの比較ができません。 マインクラフトの動作報告のURLにスペックが書いてあります。 http://www26.atwiki.jp/minecraft/pages/1069.html エイリアンウェアの公式サイトです。 http://www.dell.com/jp/p/alienware-x51-r2/pd#overrides=caa001c51jp:3~8GB2D

  • ComparableとComparatorの違いについてわからなくて困っています。

    ComparableとComparatorの違いについてわからなくて困っています。 以下のURLのサイトを記事を見ているのですが、 http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000179.html http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000180.html java.lang Comparableインタフェース メソッド public int compareTo(Object o) java.util Comparatorインタフェース メソッド public int compare(Object o1, Object o2) public boolean equals(Object obj) これらの違いについてなのですが、URLの記事では、 ・Comparableインターフェイスの実装クラスにしてcompareTo()メソッドを実装するのは、比較対象が明確であり、比較結果が一般的に分かりやすく容易に想像できる場合にのみとした方がよい ・Comparatorは任意の順番でソートしたい場合にも使用できる。例えば、昇順ではなく降順でソートしたい場合や、複数のデータを持つクラスについて細かく比較方法する場合 と記事にありますが、説明がうまく解釈できないです。 ・Comparableは主にラッパークラスやStringなどで使用するためのものなのでしょうか?(実装してるからそうだとは思いますが) 比較対照が明確なので compareToのreturn文で 除算するだけで可能? ・ComparatorはArraysやコレクション、自作クラス向けに任意の順番でソートするためのものなのですか? 自作クラスについてはComparableでもcompareTo()をオーバーライドすれば同じことが可能? 通常はComparator実装クラスのcompare()の中にreturn文でcompareTo()を使用しているような気もします。 この方法だとObject型で引数を渡して、int型に変換して比較になると思いますが、 StringだとComparableを実装してるから、戻り値でint型が返るのかな、 public int compare(String s1, String s2) { return s2.compareTo(s1) } つまり、自作クラスはインスタンスフィールドにある基本型やObject型(String, Integerなど)の値を使い、 基本型においては除算を使用し、オブジェクト(Comparableを実装しているもの)に対してはcompareTo()で比較するのでしょうか? (これで解決したような気もしますが) 質問がわかりずらくてすみません。何か解釈の間違いがあればご指摘お願いします。

  • ハッシュテーブルを使って効率の良い文字の置換がしたい場合

    はじめまして。 実はいまハッシュテーブルを利用して複数の外字をそれぞれ対応する文字に変換するJavaのプログラムを考えています。 ただ、その方針までは決まったのですが、実装方法で躓いています。 今のところ、文字列をIndexOfで探して、ある外字がでてきたらハッシュテーブルを見にいってその外字に対応する文字に変換し、また続けてその文字を探していくという方式しか考え付いてないのですが、この方法だと外字一種類ごとに文字列を検索することになってしまい、不幸率のような気がしてきました。なにか他にもっといい方法はあるでしょうか?

    • ベストアンサー
    • Java