画像の縮小のプログラムのエラーについて

このQ&Aのポイント
  • java初心者の方が画像の縮小のプログラムのエラーについて質問されています。プログラム自体のエラーは表示されないようです。
  • 質問者は他のサンプルコードを参考にしながらプログラムを書いたが、Windowに表示されるのは黒い四角形だけであると述べています。
  • 不具合の原因や修正方法について教えてほしいという質問です。
回答を見る
  • ベストアンサー

画像の縮小のプログラムのエラーについて教えて下さい

 java初心者です、宜しくお願いします。  画像の縮小のプログラムを色々と他のサンプルコードとかを参考にしながら 書きましたが、黒い四角形がWindowに表示されるだけです。  プログラム自体のエラーは表示されません。  一体どこが悪いのでしょうか、宜しくお願いします。 ===================================================== public class reSizedIImage extends Applet { Image img ; private MediaTracker tracker; BufferedImage bufimg ; BufferedImage re_img ; public void init() { setBackground( Color.white ) ; img = Toolkit.getDefaultToolkit().getImage( "a.jpg" ) ; tracker = new MediaTracker( this ) ; tracker.addImage( img , 1 ) ; try { // tracker.waitForID( 1 ) ; } catch ( Exception ex ) { ex.printStackTrace() ; } int imgw = img.getWidth( this ) ; int imgh = img.getHeight( this ) ; System.out.println(" imgw = " + imgw + " imgh = " + imgh ) ; int re_width = 300 ; int re_height = 300 ; bufimg = new BufferedImage( img.getWidth( this ) , img.getHeight( this ) , BufferedImage.TYPE_INT_RGB ) ; re_img = new BufferedImage( re_width , re_height , BufferedImage.TYPE_INT_RGB ) ; AffineTransformOp ato = new AffineTransformOp ( AffineTransform.getScaleInstance ( ( double )re_width / img.getWidth( this ) , ( double ) re_height / img.getHeight( this ) ) , null ) ; ato.filter( bufimg , re_img ) ; int re_w = re_img.getWidth(this); int re_h = re_img.getHeight(this); System.out.println(" re_img_w = " + re_w + " re_img_h = " + re_h ) ; } public void paint( Graphics g ) { g.drawImage( re_img , 200 , 200 , this ) ; } }

  • Java
  • 回答数2
  • ありがとう数10

質問者が選んだベストアンサー

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.2

Image imgインスタンスに読み込めたなら、Graphicsインスタンス経由でdrawImageすればok , bufimg も同様。 Graphics re_g = re_img.getGraphics(); re_g.drawImage(img, 0, 0, 300, 300, 0, 0, imgw, imgh, this); re_g.dispose();

westwest_2007
質問者

お礼

 mpro-gramさん、回答有難うございました。  何とかうまく実行出来ました。  プログラムを見ながら改めて、再度疑問が湧いてきましたので、宜しくお願いします。  実行の最後で「re_img」がBufferedImageとして保存することは出来るのですが、この時のサイズ は私の書いたプログラムでは、「int re_width=300 , int re_height=300」と設定していますが、 どのサイズで保存されるのでしょうか。  また、「re_g.drawImage(img,・・・・・・,this);」でサイズを指定してBufferedImageを描 画していますが、この時に「int re_width=300 , int re_height=300」との関係はどのような 関係にあるのでしょうか。  実行途中で作成される「bu_g」はどのようなファイルでしょうか、「re_img」との関係はどのような 者でしょうか。  質問ばかりで申し訳ありませんが、宜しくお願いします。

その他の回答 (1)

  • KSOH
  • ベストアンサー率93% (29/31)
回答No.1

スケーリングのソースイメージであるbufimgにイメージデータが設定されていないのが原因だと思います。 もし画面に望みのサイズでイメージを表示したいだけならこういったリサイズ処理は実は自分でやる必要はありません。 drawImage()にはいくつかのバリエーションがありますがその中に、元ネタのイメージの指定領域を画面上に好きなサイズで表示するというのがあります。例えば200x150のイメージがあってそれを300x200で表示したいといった場合、 g.drawImage(image, 0, 0, 300, 200, 0, 0, 200, 150, this); などとすれば自動的にリサイズしたイメージを描画してくれます。詳細はGraphicsのAPI Documentを参照ください。 これを使って書き直すと以下のようになります。 public class ResizedIImage extends Applet { Image img; private MediaTracker tracker; public void init() { setBackground(Color.white); img = Toolkit.getDefaultToolkit().getImage("a.jpg"); tracker = new MediaTracker(this); tracker.addImage(img, 1); try { tracker.waitForID(1); } catch (Exception ex) { ex.printStackTrace(); } } public void paint(Graphics g) { int imgw = img.getWidth(this); int imgh = img.getHeight(this); int dx = 200; int dy = 200; g.drawImage(img, dx, dy, dx+300, dy+300, 0, 0, imgw, imgh, this); } }

westwest_2007
質問者

お礼

 KSOHさん、回答有難うございます。  > スケーリングのソースイメージであるbufimgにイメージデータが設定されていないのが原因だと   思います。  # どこをどのように、プログラムを修正してやればいいのでしょうか。    bufimgを他の個所でも使いたいので、一度どこかに保存してやりたいのです。    宜しくお願いします。

関連するQ&A

  • イメージのリサイズが表示されない

    JAVA初心者です、宜しくお願い致します。 イメージをリサイズするコードを書きましたが、うまく表示されません。 コードにはエラーは出ていません、原因が分かりません。 ご教示宜しく致します。 ====================================================================== public class reSizedIImage extends Applet { Image img ; private MediaTracker tracker; BufferedImage bufimg ; BufferedImage re_img ; public void init() { setBackground( Color.white ) ; img = Toolkit.getDefaultToolkit().getImage( "a.jpg" ) ; tracker = new MediaTracker( this ) ; tracker.addImage( img , 1 ) ; try { //イメージのロードが完了するまで待機 tracker.waitForID( 1 ) ; } catch ( Exception ex ) { ex.printStackTrace() ; } int imgw = img.getWidth( this ) ; int imgh = img.getHeight( this ) ; System.out.println(" imgw = " + imgw + " imgh = " + imgh ) ; int re_width = 300 ; int re_height = 300 ; bufimg = new BufferedImage( img.getWidth( this ) , img.getHeight( this ) , BufferedImage.TYPE_INT_RGB ) ; re_img = new BufferedImage( re_width , re_height , BufferedImage.TYPE_INT_RGB ) ; AffineTransformOp ato = new AffineTransformOp ( AffineTransform.getScaleInstance ( ( double )re_width / img.getWidth( this ) , ( double )re_height / img.getHeight( this ) ) , null ) ; ato.filter( bufimg , re_img ) ; int re_w = re_img.getWidth(this); int re_h = re_img.getHeight(this); System.out.println(" re_img_w = " + re_w + " re_img_h = " + re_h ) ; } public void paint( Graphics g ) { g.drawImage( re_img , 200 , 200 , this ) ; } }

    • ベストアンサー
    • Java
  • PHP ファイルアップロードの縮小方法(比率)

    初めまして。PHP の初心者で勉強中なのですが、 ファイルのアップロードの際に確認として 画像を指定範囲に表示したいと考えています。 参考サイトで http://usualcms.net/contents/index/page/49/middle/201106/ で縮小する事ができ、 http://usualcms.net/contents/index/page/31/middle/201106/category_id/ で比率を変えずに縮小する関数の定義 とあるのですが、この二つを組み合わせて試行錯誤したのですが 行き詰まってしまいました。 <?php function getImgSize ($path, $new_width, $new_height) {        $size = array();        list ($getWidth,$getHeight) = getimagesize ($path);        $w = $new_height / $getHeight * $getWidth;        $h = $new_width / $getWidth * $getHeight;        //幅と高さの両方が指定より小さい場合        if ($getWidth <= $new_width && $getHeight <= $new_height) {                $size['new_width'] = (int)$getWidth;                $size['new_height'] = (int)$getHeight;        //幅が指定より大きい場合        } else if ($w >= $new_width && $h < $new_height) {                $size['new_width'] = (int)$new_width;                $size['new_height'] = (int)$h;        //高さが指定より大きい場合        } else if ($w < $new_width && $h >= $new_height) {                $size['new_width'] = (int)$w;                $size['new_height'] = (int)$new_height;        }        return $size; } if (isset($_POST['index_submit'])) {               $type = $_FILES['upfile1']['type'];               if ($type == 'image/jpeg' || $type == 'image/gif'                                                         || $type == 'image/png') {                       $ext = str_replace('image/', '', $_FILES['upfile1']['type']);                       $path = 'image.'.$ext;             move_uploaded_file($_FILES['upfile1']['tmp_name'], $path);            $new_width = 200;            $new_height = 200;             $new_image = imagecreatetruecolor ($new_width, $new_height);            if ($type == 'image/jpeg') {                            $image = imagecreatefromjpeg ($path);            } else if ($type == 'image/gif') {                            $image = imagecreatefromgif ($path);             } else if ($type == 'image/png') {                            $image = imagecreatefrompng ($path);             }             imagecopyresampled ($new_image,$image,                    0,0,0,0,$new_width,$new_height,                     $getWidth,$getHeight            );             imagejpeg ($new_image, $path, 100);             echo "<img src='".$path."' />";          } else {            var_dump ('error');  } } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title></title> </head> <body> <form enctype="multipart/form-data" method="post"           action="<?php echo $_SERVER['PHP_SELF']; ?>" > <input type="file" name="upfile1" /><br /> <input type="submit" name="index_submit" /> </form> </body> </html> 定義したgetImgSize関数がうまく結びついていないのは自分でも分かるのですが、 getImgSize関数を機能させる方法がうまく分からず悩んでいます。 お分かりになる方からすればご指摘だらけかと思いますが、 お力を貸していただければ大変うれしく思います。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • Javaの基礎のプログラム

    結城浩さんの本に載っていたプログラムです。 ですが、説明がわかりにくくていまいち処理がわからなかったので 質問させていただきました。 どうやら、X軸とY軸がありY軸は下に行けばいくほど数字が大きくなる。 X軸は右に行けばいくほど大きくなる。座標上にある、二つの長方形の重なりあう部分の座標を求めるプログラムのようです。(イメージとしては、下に添付してある画像のような感じになるようです。) 質問としては一つです。 プログラム中のこの部分なのですが、おそらく「長方形の座標を示している」行であると思います。 a = new Rectangle(0, 0, 20, 10); b = new Rectangle(5, 5, 20, 10); c = new Rectangle(20, 10, 20, 10); d = new Rectangle(-10, -20, 100, 200); e = new Rectangle(21, 11, 20, 10); その後の処理としては、aとb→c→d→eというようにそれぞれ比較していっているのもなんとなくわかります。 ですが、しっかり解説されていなかったので、この4つの数字がどのように座標を示しているのかよくわかりませんでした。 よろしくお願いします。 class Rectangle { final int INITIAL_WIDTH = 10; final int INITIAL_HEIGHT = 20; int width; int height; int x; int y; Rectangle() { width = INITIAL_WIDTH; height = INITIAL_HEIGHT; x = 0; y = 0; } Rectangle(int width, int height) { this.width = width; this.height = height; this.x = 0; this.y = 0; } Rectangle(int x, int y, int width, int height) { this.width = width; this.height = height; this.x = x; this.y = y; } void setLocation(int x, int y) { this.x = x; this.y = y; } void setSize(int width, int height) { this.width = width; this.height = height; } public String toString() { return "[" + x + ", " + y + ", " + width + ", " + height + "]"; } Rectangle intersect(Rectangle r) { int sx = Math.max(this.x, r.x); int sy = Math.max(this.y, r.y); int ex = Math.min(this.x + this.width, r.x + r.width); int ey = Math.min(this.y + this.height, r.y + r.height); int newwidth = ex - sx; int newheight = ey - sy; if (newwidth > 0 && newheight > 0) { return new Rectangle(sx, sy, newwidth, newheight); } else { return null; } } public static void main(String[] args) { Rectangle a, b, c, d, e; a = new Rectangle(0, 0, 20, 10); b = new Rectangle(5, 5, 20, 10); c = new Rectangle(20, 10, 20, 10); d = new Rectangle(-10, -20, 100, 200); e = new Rectangle(21, 11, 20, 10); System.out.println("a = " + a); System.out.println("b = " + b); System.out.println("c = " + c); System.out.println("d = " + d); System.out.println("e = " + e); System.out.println("a と a の重なり = " + a.intersect(a)); System.out.println("a と b の重なり = " + a.intersect(b)); System.out.println("a と c の重なり = " + a.intersect(c)); System.out.println("a と d の重なり = " + a.intersect(d)); System.out.println("a と e の重なり = " + a.intersect(e)); } }

    • ベストアンサー
    • Java
  • 意味がわかりません

    このようなプログラムがあるのですが少し意味がわからなくて困っています。わかる方解説などお願いしますm(_ _)m try{mt.waitForAll(); } catch( InterruptedException e ) { } int w = img.getWidth(this); int h = img.getHeight(this); int[] pixels = new int[w * h]; int[] epixels = new int[w * h]; int[] uepixels = new int[w * h]; int scan = w; int offset = 0; PixelGrabber pg = new PixelGrabber(img,0,0,w,h,pixels,0,scan); try{pg.grabPixels(); } catch(InterruptedException e) { ; }

    • ベストアンサー
    • Java
  • Javaで画素

    Javaについて質問したいことがあります。 Javaでjpgの白黒画像を読み取った後、画像の一番上にある黒画素のY座標を求めたいのですが、うまくいきません。ちなみに、下が現在作っているプログラムです。 どうすれば一番上にある黒画素のY座標を求める事が出来るのでしょうか? 教えてください。お願いします。 import java.awt.*; import java.applet.*; import java.awt.image.MemoryImageSource; import java.awt.image.PixelGrabber; import java.awt.image.*; import java.awt.Graphics; public class image5 extends Applet { Image img; int img_width, img_height; public void init(){ img = getImage(getDocumentBase(), "test.jpg"); } public void paint(Graphics g){ img_width = img.getWidth(this); img_height = img.getHeight(this); g.drawImage(img, 0, 0, this); int pixels[] = new int[img_width * img_height]; PixelGrabber pg = new PixelGrabber(img, 0, 0, img_width, img_height, pixels, 0, img_width); try{ pg.grabPixels(); }catch(InterruptedException e){ System.err.println("interrupted waiting for pixels!"); return; } int tx = 0; int ty = 0; int ti = 0; int maxY = 0; for(ty = 0; ty < img_height; ty++){ while(ti < 1){ for(tx = 0; tx < img_width; tx++){ if((pixels[ty * img_width + tx] & 255) > 128){ maxY = ty; ti++; } } } } } }

  • アプレットに画像が表示されません

     今晩は、java初心者です、宜しくお願いします。  下のようなプログラムを書きましたが、画像がアプレットに表示されません。  画像はeclipseで同じプロジェクト(フォルダ)内に置いています。  文法上のエラーは出ておりません。  原因がわかりません宜しくお願いします。 ============================ public class Test extends Applet { MediaTracker tracker ; Image img ; public void init() {   tracker = new MediaTracker( this ) ; img = getImage( getDocumentBase() , "a.jpg" ) ; tracker.addImage( img , 0 ) ; } public void start() {              try { tracker.waitForAll(); } catch (InterruptedException e) { } } public void paint( )      { Graphics g2 = getGraphics(); g2.drawImage( img , 0 , 0 , 50 , 50 , this ) ; } }

    • ベストアンサー
    • Java
  • java 画像変換 加工 サイズ変更

    OracleDBからBLOB型の画像データを取得しています。 本来必要のなかった処理なのですが、DBに入っている画像のデータがおかしいらしく、ピクセルとdpiの値を変更しなければなりません。 いろいろと調べてやってみようと思ったのですが、いきづまってしまいました(><) みなさんの力をお貸しください。 内容は、 ・一度DBからそのまま画像を抽出し、ファイルを作成 ・作成したファイルをもう一度BufferedImageに取り込み、サイズ変更処理開始 となっています。 しかし、BufferedImageに取り込む際に、nullが帰ってきてしまい、以降の処理ができません・・・。 また、下記処理はすべてjpgで行っていますが、本当はTiffファイルを作りたいのです。 ImageIOクラスは標準ではTiffは対応していないようなのですが、実際に下記ソースの"jpg"を"tif"に変更しても問題はないのでしょうか? 質問が煩雑で申し訳ないですが、よろしくお願いいたします。 以下ソース抜粋です。 ---------------------------------------------------------------- ImageOutNum = (String)rs.get("IMAGEGRPNO"+i)+"_"+(String)rs.get("IMAGENO"+i); // イメージファイルを作成する。 File imagef = new File(outPath2); if(!(imagef.exists()))imagef.mkdirs(); InputStream inImage = (InputStream)rs.get("IMAGEFILE"+i); if (inImage != null) { FileOutputStream outImage = new FileOutputStream(outPath2 + ImageOutNum + ".jpg"); //画像書き込み int j; while ((j = inImage.read()) != -1) { outImage.write(j); } // 解放 outImage.close(); //イメージ変更処理 InputStream orgImageFile = null; orgImageFile = new FileInputStream(outPath2 + ImageOutNum + ".jpg"); BufferedImage orgImage = ImageIO.read(orgImageFile);//ここでorgImageにnullが返されてしまいます。 int width = 640; int height = (int)(((double)width / orgImage.getWidth()) * (double)orgImage.getHeight()); BufferedImage resizeImage = new BufferedImage(width, height, orgImage.getType()); // ここからリサイズ処理 AffineTransformOp ato = null; ato = new AffineTransformOp( AffineTransform.getScaleInstance((double)width / orgImage.getWidth(),(double) height / orgImage.getHeight()),null); ato.filter(orgImage, resizeImage); // ここまでリサイズ処理 ImageOutputStream imageStream = ImageIO.createImageOutputStream(new File(outPath2 + ImageOutNum + ".jpg")); ImageWriter writer = null; Iterator it = (Iterator) ImageIO.getImageWritersByFormatName("jpg"); writer = (ImageWriter) it.next(); writer.setOutput(imageStream); JPEGImageWriteParam jpgWriter = new JPEGImageWriteParam(Locale.getDefault()); jpgWriter.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); jpgWriter.setCompressionQuality(1f); writer.write(null, new IIOImage(resizeImage, null, null), jpgWriter); imageStream.flush(); writer.dispose(); imageStream.close();

  • Androidアプリ実行エラー2

    Androidアプリ実行エラー ソースはこちらです。 package com.example.sudoku; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.Paint.FontMetrics; import android.graphics.Paint.Style; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.animation.AnimationUtils; public class PuzzleView extends View { private static final String TAG = "Sudoku"; private float width; private float height; private int selX; private int selY; private final Rect selRect = new Rect(); private final Game game; public PuzzleView(Context context) { super(context); this.game = (Game) context; setFocusable(true); setFocusableInTouchMode(true); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { width = w / 9f; height = h / 9f; getRect(selX, selY, selRect); Log.d(TAG, "onSizeChanged: width " + width + ", height" + height); super.onSizeChanged(w, h, oldw, oldh); } @Override protected void onDraw(Canvas canvas) { //背景色の描画 Paint background = new Paint(); background.setColor(getResources().getColor( R.color.puzzle_background)); canvas.drawRect(0, 0, getWidth(), getHeight(), background); //盤面を描画する //枠線の色を定義する Paint dark = new Paint(); dark.setColor(getResources().getColor(R.color.puzzle_dark)); Paint hilite = new Paint(); hilite.setColor(getResources().getColor(R.color.puzzle_hilite)); Paint light = new Paint(); light.setColor(getResources().getColor(R.color.puzzle_light)); //マス目を区切る線 for (int i = 0; i < 9; i++) { canvas.drawLine(0, i * height, getWidth(), i * height, light); canvas.drawLine(0, i * height + 1, getWidth(), i * height + 1, hilite); canvas.drawLine(i * width, 0, i * width, getHeight(), light); canvas.drawLine(i * width + 1, 0, i * width + 1, getHeight(), hilite); } //3*3を区切る線 for (int i = 0; i < 9; i++) { if(i % 3 != 0) continue; canvas.drawLine(0, i * height, getWidth(), i * height, dark); canvas.drawLine(0, i * height + 1, getWidth(), i * height + 1, hilite); canvas.drawLine(i * width, 0, i * width, getHeight(), dark); canvas.drawLine(i * width + 1, 0, i * width + 1, getHeight(), hilite); } //数値を描画する Paint foreground = new Paint(Paint.ANTI_ALIAS_FLAG); foreground.setColor(getResources().getColor(R.color.puzzle_foreground)); foreground.setStyle(Style.FILL); foreground.setTextSize(height * 0.75f); foreground.setTextScaleX(width / height); foreground.setTextAlign(Paint.Align.CENTER); //マスの中央に数字を描く FontMetrics fm = foreground.getFontMetrics(); //x軸方向でセンタリングする。中央のx座標に揃える float x = width / 2; // float y = height / 2 - (fm.ascent + fm.descent) / 2; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { canvas.drawText(this.game.getTileString(i, j),i * width + x, j * height + y, foreground); } } //ヒントを描画する //選択されたマスを描画する } private void getRect(int x, int y, Rect rect) { rect.set((int) (x * width), (int) (y * height), (int) (x * width + width), (int) (y * height + height)); } } ログはこちらです。 ご回答をよろしくお願いします。 http://okwave.jp/qa/q8272113.html

  • javaの課題が難しくて解けません。力を貸してください

    本日、プログラムの授業で課題が出されました。 解ける方がいましたら、回答を教えてください。 課題:これまでの演習で作成した Rectangle, Triangle, Circle, Trapezoidクラスを利用するクラス (メインクラス)を修正して, コマンドライン引数から図形の種類、入力値を指定できるようにしてみよ。 ※4つのクラスをpackageで1つにまとめる必要があるようです。 お手数かけますが、宜しくお願いします。 下記が演習で作成した4つのクラスになります。参考にしてください。 (Rectangleクラス) import java.io.*; class Rectangle { private int width; private int height; public Rectangle(int w, int h) { width = w; height = h; } public void setWidth(int w) { width = w; } public void setHeight(int h) { height = h; } public int getWidth() { return width; } public int getHeight() { return height; } public double calcArea() { return width * height; } public void show() { System.out.println("width=" + getWidth() + ", height= " + getHeight()); } } public class kadai1 { public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("width= "); String str1 = br.readLine(); System.out.print("height= "); String str2 = br.readLine(); Rectangle r = new Rectangle(Integer.parseInt(atr1),Integer.parseInt(str2)); r.show(); System.out.println("面積 = " + r.calcArea()); } } (Triangleクラス) public double calcArea() { return width * height / 2.0; } (Circleクラス) public double calcArea() { return Math.PI * radius * radius; } public void show() { System.out.println("radius= " + getRadius()); } (Trapezoidクラス) public double calcArea() { return (upper + lower) * height / 2.0; } public void show() { System.out.println("upper= " + getUpper() + ", lower= " + getLower() + ", height= " + getHeight()); }

  • privateなフィールドは継承されない?

    たとえば、 class A { private int width; public A(){ this.width=3; } public int getWidth(){ return width; } public void setWidth(int width){ this.width=width; } } -------------------------------- class B extends A { String name; public B(){ this.name="あきら"; } } -------------------------------- class TestAB{ public static void main(String[] args){ B b = new B(); B b2= new B(); System.out.println(b.getWidth()); b2.setWidth(5); System.out.println(b2.getWidth()); System.out.println(b.getWidth()); } } というのがあったとして、ある参考書では「privateなフィールドは継承されない」と書いてありました。 でも、これってwidthに直接アクセスして値を変更できないだけであって、 widthは継承されてるのではないですか? B型のb専用、b2専用のwidthがあるのではないですか? ちょっと頭がこんがらがってきました。。

    • ベストアンサー
    • Java

専門家に質問してみよう