7

まず、これはモザイク画像ジェネレーターを作成するための宿題の一部です。プログラムが画像を見つけたときにリアルタイムで再描画し、別の画像 (ソース画像) の上に配置するようにします。

これは、メイン関数でパネルを作成するコードです。

最後の部分 mypanel.create() はモザイク ロジックです。

myPanel = new mosiacPanel(sourceFile, sizePercent, pixesize,threads, imageList);
//test.setText(Integer.toString(myPanel.getWidth()));
JFrame frame2 = new JFrame("COS 226 MOSIAC OF AWESOMENESS BY SLUIPMOORD && ELEANORASAURUSS");
myPanel.setVisible( true );
myPanel.repaint();
frame2.add(myPanel);
if(myPanel.getWidth() > menubar.getWidth()){
    frame2.setSize(myPanel.getWidth() , myPanel.getHeight() + menubar.getHeight() );
    frame2.repaint();
} else {
    frame2.setSize(menubar.getWidth() , myPanel.getHeight() + menubar.getHeight() );
}
frame2.setVisible( true );
//  myPanel.setLocation(170, 4);
myPanel.create();

モザイク パネル クラスのコード スニペット

public void create()
{
    ph.createMosiac(imgUrls, this);
}

@Override
protected void paintComponent( Graphics g ) 
{  super.paintComponent(g); 
   g.drawImage( imgToPaint, 0, 0, null );
   // System.out.println("paint");
}

public void paintTile( BufferedImage img ) 
{

    imgToPaint = img;        
    this.repaint();
    // this.paintComponent(this.getGraphics());
}

create Mosaic 関数内で paintTile 関数を呼び出します。

public void createMosiac(List<String> fileNames, mosiacPanel parent)
{
    ArrayList<TileImage> srcTiles = new ArrayList<TileImage>();

    for( int i = 0; i < fileNames.size(); i++ ) 
    {
        srcTiles.add( new TileImage( fileNames.get(i), tileSize ) );
    }

    for( int y = 0; y <= (this.getHeight() - tileSize); y += tileSize ) 
    {           
        for( int x = 0; x <= (this.getWidth() - tileSize); x += tileSize ) 
        {
            int location = 0;
            double  dist, high = 2147483647;
            for( int i = 0; i < srcTiles.size(); i++ ) 
            {
                dist = this.getTileImage(x, y).differance( srcTiles.get(i) );

                if( (dist < high) )
                {
                    high = dist;
                    location = i;
                }                       
            }

            this.setTileImage( x, y, srcTiles.get(location) );
            parent.paintTile(this);                   
        }            
    }                        
}

それが私のプログラムロジックです。2 番目のスニペットでこれをコメント解除すると // this.paintComponent(this.getGraphics()); プログラムは動作しますが、恐ろしいフラッシュで再描画されます。デモ会場内の他の学生の何人かがてんかん発作を起こしやすいとき、私は医療費の対象ではありません.

paintComponent 関数をトレースすると、再描画ごとではなく、プログラムの最後に 2 回呼び出されます。

前もって感謝します。

皆さんがコピーして実行できるソースコードを追加しました。テストしたい画像を選択してください デフォルトは現在利用できません。

そして、それを並べて表示するための大量のjpgを含むディレクトリ 現時点ではかなり遅いですが、 GoogleドキュメントのJavaファイルへのリンクを修正する必要があります

4

1 に答える 1

1

別のスレッドで再ペイントしてみてください。多分これはあなたの問題を解決するでしょう。幸運を!:)

于 2013-03-20T17:02:09.947 に答える