gpt4 book ai didi

java - 将图像转换为字节数组时使用 JProgressBar

转载 作者:行者123 更新时间:2023-12-02 05:37:43 24 4
gpt4 key购买 nike

以下是将图像转换为字节数组的简单代码(本论坛已显示):

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();

但是,当图像尺寸较大时,程序需要花费太多时间来转换。因此,我正在考虑在我制作的 GUI 中添加一个 JProgressBar,让用户知道还剩多少时间。我见过的所有示例主要都是使用循环处理 JProgressBar。我不知道如何从这里开始:(我可以有一个想法开始吗?换句话说,我应该把 JProgressBar 放在这里的哪里。

提前谢谢您。

最佳答案

所以,你需要两件事......

首先,您需要某种方法来监 View 像加载和写入的进度...这很快就会变得有点复杂,因为为了能够监视操作的进度,您需要知道实际的情况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 方法来读取/写入图像,进度属性支持可用于更新进度指示器和 publish/ 流程 方法可用于提供有关当前操作的其他信息。

您甚至可以使用 done 方法来处理当 doInBackground 方法完成时需要更新 UI 的情况。

对于example

关于java - 将图像转换为字节数组时使用 JProgressBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24815494/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com