2

gif からすべてのフレームを抽出し、最後のフレームの下に次のフレームを配置して列に配置しようとしています。そのため、背の高い画像を下にスクロールして gif を見ることができます。すべてのフレームを抽出できますが、書き出そうとすると、黒いキャンバスしか得られません。幅と高さは正しく、画像を正しく読み取っていると言っています。ここで何がうまくいかないのですか?

    String img = "test.gif"; //original gif
    String[] temp = img.split(".gif");
    String base = temp[0];

    try {
        ImageReader reader = ImageIO.getImageReadersBySuffix("GIF").next();
        ImageInputStream in = ImageIO.createImageInputStream(new File(img));
        reader.setInput(in);

        int rows = reader.getNumImages(true);  // How many images there will be 
        int cols = 1;
        int chunks = rows;
        int chunkWidth, chunkHeight;
        int type;

        type = reader.read(0).getType(); //Get single frame file type
        chunkWidth = reader.read(0).getWidth(); //Get single frame width
        chunkHeight = reader.read(0).getHeight();  //Get single frame height

        //Initializing the final image
        BufferedImage finalImg = new BufferedImage(chunkWidth, chunkHeight * rows, type);

        for (int i = 0, count = reader.getNumImages(true); i < count; i++) {
            BufferedImage image = reader.read(i); //read next frame from gif
            finalImg.createGraphics().drawImage(image, chunkWidth, chunkHeight * i, null); //append new image to new file
        }

        System.out.println("Image concatenated.....");
        ImageIO.write(finalImg, "png", new File("finalImg1234555.png")); //final png with all gif images in it

    } catch (IOException ex) {
        Logger.getLogger(Gifextract.class.getName()).log(Level.SEVERE, null, ex);
    }
4

1 に答える 1

3

finalImg.createGraphics().drawImage(image, chunkWidth, chunkHeight * i, null);

x 座標は ですchunkWidth。これは、画像の左端が から始まることを意味しchunkWidthます。finalImgの幅は you のみであるため、の境界のchunkWidth完全に外側に描画しています。finalImgx座標は であると思われます0

于 2013-01-06T09:24:56.817 に答える