1

Javaを使用して、複数の画像をより大きな画像に結合しようとしています。渡されるイメージはすべて、高さ 127 x 幅 293 です。アイデアは、多数のイメージがメソッドに渡され、メソッドがイメージを取得して別の大きなイメージに構築するというものです。大きな画像のレイアウトは、合計 12 の可能な画像を大きな画像に入力することができ、等間隔 (6 つの画像の 2 行、重複なし) です。渡された画像が 12 未満の場合、最初のスペースだけが埋められますが、背景が白になるため、残りの画像は白になります。プログラムを実行すると、より大きな画像が印刷されますが、渡された画像の数に関係なく、左上に最初の画像を表示する最初のスペースしか埋められません。また、背景は意図した白い背景ではなく、ピンクがかった色です。私は Java の初心者にすぎないので、これらの学習の苦痛のいくつかを乗り越えようとしています。私の問題をどのように解決できるかについてのアドバイスはありますか? (参照用にコードを以下にコピーします) ありがとうございます。

public class ImagesCombine {

public String BuildImgs (File[] imgs)throws IOException {
    int arsize = imgs.length;
    File path = new File("Z:/JAVAFiles/Images/");
    BufferedImage page = new BufferedImage(620,900,BufferedImage.TYPE_INT_ARGB);
    Graphics2D paint;
    paint = page.createGraphics();
    paint.setPaint(Color.WHITE);
    paint.fillRect ( 0, 0, page.getWidth(), page.getHeight() ); 
    paint.setBackground(Color.WHITE);
    String tmpname = "";

    for (int i=0;i<imgs.length;i++){

        if(i==0){ 
            Image img0 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img0,0,0,null);
            paint.dispose();
            }
        if(i==1){
            Image img1 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img1,323,0,null);
            paint.dispose();
            }
        if(i==2){
            Image img2 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img2,0,142,null);
            paint.dispose();
            }
        if(i==3){
            BufferedImage img3 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img3,323,142,null);
            paint.dispose();
            }
        if(i==4){
            BufferedImage img4 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img4,0,284,null);
            paint.dispose();
            }
        if(i==5){
            BufferedImage img5 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img5,323,284,null);
            paint.dispose();
            }
        if(i==6){
            BufferedImage img6 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img6,0,426,null);
            paint.dispose();
            }
        if(i==7){
            BufferedImage img7 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img7,323,426,null);
            paint.dispose();
            }
        if(i==8){
            BufferedImage img8 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img8,0,568,null);
            paint.dispose();
            }
        if(i==9){
            BufferedImage img9 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img9,323,568,null);
            paint.dispose();
            }
        if(i==10){
            BufferedImage img10 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img10,0,710,null);
            paint.dispose();
            }
        if(i==11){
            BufferedImage img11 = ImageIO.read(new File(path, imgs[i].getName()));
            paint.drawImage(img11,323,710,null);
            paint.dispose();
            }

        }
    String outpath = "Z:\\JAVAFiles\\" + imgs[0].getName().substring(0,16) + ".jpg";

    OutputStream outfile = new FileOutputStream(outpath);

    JPEGImageEncoder encoder2 = JPEGCodec.createJPEGEncoder(outfile);
    encoder2.encode(page);
    outfile.close();
    return("Success");  
}
}
4

4 に答える 4

2

私が最初に気付くのは、dispose()各画像の描画後にGraphics2Dを呼び出していることです。これがおそらく、大きな画像に1つの画像しか描画されていない理由です。その呼び出しを取り出して、ループの後に配置すると、より多くの画像が表示されるようになります。

補足として、forループを大幅に簡略化できます。

int width = 293;
int height = 127;
for (int i=0; i < Math.min(imgs.length, 12); i++){
    Image image = ImageIO.read(new File(path, imgs[i].getName()));
    int row = i / 6; // This will truncate to 0 or 1.
    int column = i % 6; // Mod will produce the remainder of i / 6 in the range 0-5
    paint.drawImage(image, column * width, row * height, null);
}
于 2011-07-20T20:14:17.603 に答える
0

GridLayout を使用するパネルを作成しますか? 次に、各ラベルに ImageIcon を含む 12 個の JLabels をパネルに追加できます。このようにして、レイアウト マネージャーは、画像の配置と描画という面倒な作業をすべて行います。

于 2011-07-20T20:59:28.423 に答える
0

for ループ内で dispose メソッドを呼び出しているため、プログラムがループ内のコードの最初の実行を完了すると、ペイント オブジェクトが削除されます。ループを 2 回目に参照するとき、プログラムはペイント オブジェクトを見つけることができないため、次の画像を描画することも、部屋を白で塗りつぶすこともできません。

for ループを閉じた直後に dispose メソッドを使用してみてください。

また、いくつかの println メソッドを追加して、imgs アイテムが返す長さを確認することもできます。通常、ループで使用する変数内の数値をチェックして、必要なものが得られているかどうかを確認する必要があります。

于 2011-07-20T20:34:21.070 に答える