• 締切済み

jpeg画像でアニメーションを作る

jpeg画像10枚くらいをつかい、アニメーションを作りたく以下のようなプログラム(全部載せられませんでした)を組んでみました。しかし、画像読み込みにすごく時間がかかり、アニメーションという感じがしないほど、さっと画像が表示されて終わってしまいます。もっと、一枚一枚をゆっくり表示させたく画像読み込みの時間も短縮したいのですが、何か良い方法はありますでしょうか(ちなみに画像のキャンバスサイズは512×384です) import java.applet.*; import java.awt.*; import java.net.*; public class im2a extends Applet implements Runnable{ Image im[] = new Image[10]; URL url; String fn[]={"anime10.jpg","anime11.jpg","anime4.jpg","anime5.jpg",  "anime1.jpg","anime2.jpg","anime1.jpg","anime2.jpg",  "anime8.jpg","anime7.jpg"}; Thread th; MediaTracker mt = new MediaTracker(this); String ms =""; String s =""; int i=0; int j=0; int dt=100; int phase=2 ; boolean ok=false;   public void start(){ th =new Thread(this); th.start(); }    public void readImage(){ ms ="画像入力準備中"; repaint(); for(i=0;i<9;++i){ im[i]=getImage(getDocumentBase(),fn[i]); mt.addImage(im[i],i); ok=false; while(!ok){ try{ Thread.sleep(2000); } catch(InterruptedException ee) { } ok=mt.checkID(i,true); } ms="画像"+i+"読み込み終了"; repaint(); } }

  • Java
  • 回答数1
  • ありがとう数0

みんなの回答

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.1

画像を読み込む時に、一枚読んでは2秒ずつsleepしていては、読み込みにすごっく時間掛かるのもあたりまえ。 readImage()での読み込みは、sleppなど掛けずにさっさとloadさせて、 表示は、run()関数内にwhileループを作り表示変更とrepaint()してはsleepを掛けるようにすればいい。 で、readImage()はどこから呼び出されているのかな? run()が省略されている? 画像初期化用関数は、start()で一回呼び出せば十分と思うけど。

関連するQ&A

  • 画像がうまく表示されません

    下のプログラムを実行すると、 最初の読みこみはうまくいくのですが、(一部出なくなる画像がありますが…) Internet Explorerの更新ボタンを押した時、 (1)の部分で止まってしまうようで、画像が表示されなくなります。 (ローカルドライブで実行した場合はうまく表示できるのですが、ネットワークで実行した場合にこのようになってしまいます) import java.applet.Applet; import java.awt.*; public class met extends Applet{ Image img[] = new Image[6]; MediaTracker mt; public void init(){ mt = new MediaTracker(this); for(int i = 0;i < 6;i++){ img[i] = getImage(getCodeBase(),i+".gif"); mt.addImage(img[i],0); } try{ mt.waitForID(0); }catch(InterruptedException e){} } public void paint(Graphics g){ // (1) if(!mt.checkID(0)){ g.clearRect(0,0,500,500); g.drawString("読み込み中",200,240); return; } g.setColor(Color.white); g.fillRect(0,0,500,500); for(int i = 0;i < 6;i++){ g.drawImage(img[i],i*50,0,this); } } }

    • ベストアンサー
    • Java
  • [javaプログラムについて] うまく動きません。

    import java.*; class Test { void main() { Th th1 = new Th("01スレッド"); Th th2 = new Th("02スレッド"); th1.start(); th2.start(); } } class Th extends Thread { void run(String pri) { for (int i=0;i<5;i++) { System.out.println(pri + " : " + i); } } } スレッドの使い方がいまいちよく分かりません。 どこが間違っているのか教えてください。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • 画像がうまく表示されない。

    アプレットを作っています。 左クリックすると、次の画像へ進む、といった処理を実装したのですが、1回は次の画像へ進むのですが、2回目以降が進みません(しかも、「1.jpg」から「2.jpg」へ進めたいのですが、何故か「1.jpg」から「10.jpg」にいってしまいます。)以下が現在のコードです。 余分な部分は削除しました。よろしくお願いします。 public class Main extends Applet implements MouseListener, Runnable{ Image nowImage, nextImage; static int i; MediaTracker mt = new MediaTracker(this); MediaTracker mt2 = new MediaTracker(this); int yousosu,w,h; Thread thread; static float alpha; static boolean runflag = true; static boolean flag = true; static int j = 1; Image buf; Graphics ct; int sleeptime = 300; Image img; Vector imgs = new Vector(); public void init(){ i = 0; thread = new Thread(this); yousosu = Integer.parseInt(getParameter("NumImage"));//配列(画像)の要素数 for(int t = 0; t < yousosu; t++){ img = getImage(getDocumentBase(),"imagesyukusyo/" + t+1 + ".JPG"); imgs.addElement(img); img = null; } int kazu = imgs.size(); addMouseListener(this); w = getSize().width; h = getSize().height; buf = createImage(w,h);//バッファ取得 //*******最初の画像のロード******* nowImage = getImage(getDocumentBase(), "imagesyukusyo/1.JPG");//←Vectorの[0]要素? } public void update(Graphics g){ paint(g); } public void paint(Graphics g){//drawImageファイルを表示するだけ ct = buf.getGraphics(); Graphics2D ct2 = (Graphics2D) ct; Graphics2D g2 = (Graphics2D) g;//Grahics2Dクラス AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); mt.addImage(nowImage,0); mt2.addImage(nextImage, 0); try { mt.waitForID(0); mt2.waitForID(0); } catch (InterruptedException e) { e.printStackTrace(); } ct2.drawImage(nowImage,0,0,w,h,this); ct2.setComposite(composite); //次からはcompositeを設定した後の描画になる。 ct2.drawImage(nextImage,0,0,w,h,this); g2.drawImage(buf,0,0,w,h,this); } //*********マウスイベント************ public void mouseClicked(MouseEvent e) { int btn = e.getButton(); //*******左クリック********** if(btn == MouseEvent.BUTTON1){//左クリック=進め System.out.println("左クリック"); System.out.println("iは"+i); System.out.println("elementAtの数は"+imgs.size()); if(i >= yousosu){//要素数より多くなったら… i = 0; } nowImage = (Image)imgs.elementAt(i); if(i == yousosu-1){ nextImage = (Image) imgs.elementAt(0); }else{ //通常こっち nextImage = (Image) imgs.elementAt(i+1); } thread = new Thread(this); thread.start(); thread = null; i++; } } public void run(){ alpha = 0.2f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.3f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.4f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.5f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.6f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.7f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.8f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.9f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 1f; repaint(); } }

    • ベストアンサー
    • Java
  • javaでアニメーションを簡単に作るには?

    5枚の絵をループでアニメーションさせたいのですが。フレームを表示させるところまでは出来たのですが、その先がよく分かりません。どのようにしてアニメーションすればいいのでしょうか? よろしくお願い致します。 package animation; import java.awt.*; import javax.swing.*; public class Animation extends JFrame implements Runnable{ Animation () { getContentPane ().setLayout (new FlowLayout ()); setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); setSize (200, 300); setVisible (true); Thread th = new Thread (); th.start (); } public void start(){ } public void run(){ } /** * @param args the command line arguments */ public static void main (String[] args) { // TODO code application logic here Animation anime = new Animation (); } }

  • 画像読み込みのエラー処理

    画像を表示するアプレットのソースです。 ファイル名はstrで設定します。 Image img; String str; str = "xx.jpg"; img = getImage(getDocumentBase(), str); if (img.equals(null)) { mydbg("001"); } else { mydbg("002"); } //strがでたらめで、そのパスの画像が存在しなくても //getImage()は成功するんですか?実験してみるとそのようでした。 //その画像が存在しない場合、この下のソースでmydbg("003");が //実行されるはずなのに実行されません。 //画像が存在しない場合のエラー処理のよいソースを教えてください。 MediaTracker mt = new MediaTracker(this); mt.addImage(img, 0); try { mt.waitForID(0); repaint(); } catch (Exception e) { mydbg("003"); }

    • ベストアンサー
    • Java
  • 作ったクラスにイベントを追加するには?

    パネルを継承したクラスを作りました(パネルA)。 そのパネルAをメインフレームに作成しました。 作ったパネルAの上にサブパネルBを作りました。 サブパネルのイベントを書きたいのですがコードは作ったクラス内に書けないのでしょうか? 例)下記が作ったパネル継承クラスです。この中でpnlSubを作っているのです。で、このpnlSubのクリックイベントを書きたいのですが、どのようにイベントを用意すればよいのでしょう? package ### import java.awt.*; public class PanelA extends Panel{ Image im; Panel pnlSub = new Panel(); //CONSTRUCT public PanelA(String img) { im = Toolkit.getDefaultToolkit().getImage(img); //MediaTracker画像入力監視 MediaTracker mt = new MediaTracker(this); mt.addImage(im, 0); try { mt.waitForID(0); } catch (InterruptedException e) { } //パネル(pnlVolume)設定 this.add(pnlVolume, null); pnlSub.setBackground(Color.red); pnlSub.setBounds(new Rectangle(5, 8, 108, 5)); } //Print public void paint(Graphics g) { if (g.drawImage(im, 0, 0, this) != true) { System.out.println("ng"); } } }

    • ベストアンサー
    • Java
  • Javaアプレットについてですが

    Javaアプレットでボタンを押したら数字が増えるものを作っているのですがどうもうまく動きません。 ソースは下の通りです。 変更しなければいけないところがあるならお願いします。 import java.applet.Applet; import java.awt.Graphics; import java.awt.Button; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Sample7 extends Applet implements Runnable, ActionListener { Button bt; int num; public void init() { bt = new Button("開始"); add(bt); bt.addActionListener(this); Thread th; th = new Thread(this); th.start(); } public void actionPerformed(ActionEvent ae) { public void run() { try{ for(int i=0; i<11; i++){ num = i; repaint(); Thread.sleep(1000); } } catch(InterruptedException e){} } } public void paint(Graphics g) { String str = num + "です。"; g.drawString(str, 50, 50); } }

    • ベストアンサー
    • Java
  • javaの配列について。

    javaのプログラミングについてなのですが、配列を利用して、 画像イメージ zu0.jpg,zu1.jpg,zu2,jpgをウィンドウズアプリケーションで 3つ縦に並べて表示させ、ページ上部にタイトルを入れろという課題が出たのですが、 なかなかうまいきません。原因がわからないので質問させていただきます。 どうかお力添えお願いいたします。 ↓↓プログラム文↓↓ import java.awt.*; class PictF extends Frame{ Font f; Image im; PictF(){ setBackground(new Color(200,255,255)); f=new Font("Dialog",Font.ITALIC,36); Image[] im=new Image[3]; for(int i=0;i<im.length;i++) im[i]=Toolkit.getDefaultToolkit().getImage("zu"+i+".jpg"); setTitle("image"); setSize(400,700); } public void paint(Graphics g){ Image[] im=new Image[3]; for(int i=0;i<im.length;i++) g.drawImage(im[0],10,10,this); g.drawImage(im[1],10,100,this); g.drawImage(im[2],10,210,this); g.setFont(f); g.setColor(Color.blue); g.drawString("Ikeda Auditorium",100,240); } public static void main(String[] args){ PictF pf=new PictF(); pf.setVisible(true); } }

    • ベストアンサー
    • Java
  • なぜエラーになるのかがわかりません?(長文です。)

    下記のクラス(Panel_Middle)内でパネル(pnlFd)を作成してます。しかし、メインフォームからこのクラスの"CreateMainPanel"関数を呼ぶと "pnlFd.setBounds(new Rectangle(5, 5, 110, 38));" の後に"java.lang.NullPointerException "とエラーが出ます。色々考えたのですが、理由がわかりません。 public class Panel_Middle extends Panel{ Panel_Main pnlFd = new Panel_Main("A.gif","B.gif"); Image im; //CONSTRUCT public Panel_Middle(String img) { im = Toolkit.getDefaultToolkit().getImage(img); //MediaTracker画像入力監視 MediaTracker mt = new MediaTracker(this); mt.addImage(im, 0); try { mt.waitForID(0); } catch (InterruptedException e) { } } //Print public void paint(Graphics g) { if (g.drawImage(im, 0, 0, this) != true) { System.out.println("ng"); } } public void CreateMainPanel(){   this.add(pnlFd, null); pnlFd.setBounds(new Rectangle(5, 5, 110, 38)); pnlFd.setImageInit(); } }

    • ベストアンサー
    • Java
  • javaで画像ファイルを連続に取り込む方法

    javaのプログラムで、 load("00001.jpg"); というようにjpgファイルを読み込んでいます。 これを00001.jpg~000009.jpgまで連続に読み込みをしたいのですが、どのようにすればよいでしょうか。 変な書き方になりますが、 for(int i=0;i<9;i++){ load("0000i.jpg"); } のようにしたいです。これだとiが文字として認識されてしまいますが・・・

    • ベストアンサー
    • Java

専門家に質問してみよう