[英]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.