2009-04-22 29 views
22

Có ai quản lý để thuyết phục ImageIO viết một GIF động và đặc biệt là thiết lập siêu dữ liệu chính xác không? Nỗ lực đầu tiên của tôi là khoảng như sau (nơi b1 và b2 là BufferedImages):Tạo GIF động bằng ImageIO?

ImageTypeSpecifier spec = new ImageTypeSpecifier(b1); 
ImageWriter wr = ImageIO.getImageWriters(spec, "GIF").next(); 
wr.setOutput(ImageIO.createImageOutputStream(new File("C:\\Flashing.gif"))); 
ImageWriteParam param = wr.getDefaultWriteParam(); 
IIOMetadata meta = wr.getDefaultImageMetadata(spec, param); 
wr.prepareWriteSequence(meta); 
wr.writeToSequence(new IIOImage(b1, null, null), param); 
wr.writeToSequence(new IIOImage(b2, null, null), param); 

này dường như hầu hết công việc, nhưng:

  • tôi cần rõ ràng bằng cách nào đó thiết lập "thích hợp" siêu dữ liệu để thiết lập thời gian giữa các hình ảnh và lý tưởng làm cho chúng vòng lặp (tôi đã ngây thơ hy vọng mặc định sẽ làm điều gì đó hợp lý, nhưng hey ...)
  • bất kỳ siêu dữ liệu nào được viết theo mặc định là không rõ ràng: GIMP đưa ra một vài lỗi thư khi tải tệp, mặc dù nhúng hình ảnh vào trang web thử nghiệm trong Firefox sẽ hiển thị o hình ảnh liên tiếp rất nhanh, gần giống với những gì tôi muốn ...

Nếu ai đó đã viết GIF động từ ImageIO để làm việc và có thể chia sẻ một đoạn mã làm việc hoặc cách khắc phục các vấn đề trên , Nó sẽ được đánh giá rất cao!

Trả lời

29

Tôi đã xem qua câu hỏi này và quyết định dùng thử; Phải mất một số lượng nhỏ nhưng không tầm thường tạo ra một lớp có thể sử dụng (nhờ ax) - vì vậy tôi nghĩ rằng tôi có thể chia sẻ mã xung quanh: here là một lớp nhỏ để tạo hình ảnh gif động từ một số hình ảnh khác.

+1

Có lỗi trong ví dụ được cung cấp trong hàm main(). Nhận xét cho biết: '// chuỗi gif với loại hình ảnh đầu tiên, 1 giây giữa các khung, vòng lặp liên tục', đó sẽ là' GifSequenceWriter mới (output, firstImage.getType(), 1000, true) 'thay vì 'GifSequenceWriter mới (output, firstImage.getType(), 1, false)' – gvlasov

+3

Ngoài ra, nếu bạn phát hiện ra rằng các màu trong suốt không được xử lý đúng cách (khi bạn viết một màu trong suốt, một pixel từ khung trước vẫn giữ nguyên), bạn cần để làm điều này: tìm một dòng với 'graphicsControlExtensionNode.setAttribute (" discardMethod "," none ");' và thay đổi '" none "' thành '" restoreToBackgroundColor "' – gvlasov

+0

Mã của bạn vẫn được tham chiếu trên stackoverflow [4 năm sau] (http://stackoverflow.com/questions/16649620/is-there-a-way-to-create-one-gif-image-from-multiple-images-in-java) và tôi dự định sử dụng nó 7 năm sau đó:) – Aaron

Các vấn đề liên quan