簡體   English   中英

在將圖像轉換為字節數組時使用JProgressBar

[英]Using JProgressBar while converting image to byte array

以下是用於將圖像轉換為字節數組的簡單代碼(在本論壇中已經顯示):

File imgPath= new File(textFiled_Path.getText());
BufferedImage originalImage = ImageIO.read(imgPath);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(originalImage, "png", baos);
baos.flush();
byte[] imageInByte = baos.toByteArray(); 

但是,當圖像較大時,該程序將花費太多時間進行轉換。 因此,我正在考慮將JProgressBar添加到我制作的GUI中,以使用戶知道還剩下多少時間。 我所看到的所有示例都主要是通過循環處理JProgressBar。 我不知道如何從這里開始:(我可以從一個想法開始。換句話說,我應該在哪里把JProgressBar放在這里。

先感謝您。

所以,您需要兩件事...

首先,您需要某種方式來監視圖像加載和寫入的進度...這很快變得有點復雜,因為要能夠監視操作的進度,您需要了解實際的讀寫器由ImageIO ....

File file = new File("...");
try (ImageInputStream iis = ImageIO.createImageInputStream(file)) {
    Iterator<ImageReader> readers = ImageIO.getImageReaders(iis);
    if (readers.hasNext()) {
        ImageReader reader = readers.next();
        reader.addIIOReadProgressListener(new IIOReadProgressListener() {
            @Override
            public void sequenceStarted(ImageReader source, int minIndex) {
            }

            @Override
            public void sequenceComplete(ImageReader source) {
            }

            @Override
            public void imageStarted(ImageReader source, int imageIndex) {
            }

            @Override
            public void imageProgress(ImageReader source, float percentageDone) {
                //TODO: Update progress...
            }

            @Override
            public void imageComplete(ImageReader source) {
            }

            @Override
            public void thumbnailStarted(ImageReader source, int imageIndex, int thumbnailIndex) {
            }

            @Override
            public void thumbnailProgress(ImageReader source, float percentageDone) {
            }

            @Override
            public void thumbnailComplete(ImageReader source) {
            }

            @Override
            public void readAborted(ImageReader source) {
            }
        });
        reader.setInput(iis);
        try {
            BufferedImage img = reader.read(0);

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            try (ImageOutputStream ios = ImageIO.createImageOutputStream(baos)) {
                Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("png");
                if (writers.hasNext()) {
                    ImageWriter writer = writers.next();
                    writer.addIIOWriteProgressListener(new IIOWriteProgressListener() {
                        @Override
                        public void imageStarted(ImageWriter source, int imageIndex) {
                        }

                        @Override
                        public void imageProgress(ImageWriter source, float percentageDone) {
                            // TODO: Update progress
                        }

                        @Override
                        public void imageComplete(ImageWriter source) {
                        }

                        @Override
                        public void thumbnailStarted(ImageWriter source, int imageIndex, int thumbnailIndex) {
                        }

                        @Override
                        public void thumbnailProgress(ImageWriter source, float percentageDone) {
                        }

                        @Override
                        public void thumbnailComplete(ImageWriter source) {
                        }

                        @Override
                        public void writeAborted(ImageWriter source) {
                        }
                    });

                    writer.setOutput(ios);
                    try {
                        writer.write(img);
                    } finally {
                        writer.removeAllIIOWriteProgressListeners();
                    }
                }
            }
        } finally {
            reader.removeAllIIOReadProgressListeners();
        }
    }
} catch (IOException exp) {
    exp.printStackTrace();
}

好的,現在您已經有了,接下來需要做的事情是在事件調度線程的上下文之外執行某種方法,以免阻塞UI,這樣UI仍將保持響應狀態,但是您還希望通過您可以輕松地更新UI而不違反單線程規則(對UI的更新必須在事件調度線程的上下文內完成)

為此, SwingWorker非常適合。

本質上,您將使用doInBackground方法來讀取/寫入圖像,可以使用progress屬性支持來更新進度指示器,並且可以使用publish / process方法來提供有關當前操作的其他信息。

您甚至可以使用done方法來處理doInBackground方法完成后需要更新UI的情況。

舉個例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM