Java 将图像转换为字节数组时使用JProgressBar
以下是将图像转换为字节数组的简单代码(已在本论坛中展示): 但是,当图像大小较大时,程序需要花费太多时间进行转换。因此,我考虑在GUI中添加一个JProgressBar,让用户知道还有多少时间。我所看到的所有示例都是使用循环处理JProgressBar的。我不知道如何从这里开始:(我可以有一个想法开始。换句话说,我应该把JProgressBar放在哪里Java 将图像转换为字节数组时使用JProgressBar,java,swing,jprogressbar,Java,Swing,Jprogressbar,以下是将图像转换为字节数组的简单代码(已在本论坛中展示): 但是,当图像大小较大时,程序需要花费太多时间进行转换。因此,我考虑在GUI中添加一个JProgressBar,让用户知道还有多少时间。我所看到的所有示例都是使用循环处理JProgressBar的。我不知道如何从这里开始:(我可以有一个想法开始。换句话说,我应该把JProgressBar放在哪里 提前谢谢你。所以,你需要两件事 首先,您需要某种方法来监控图像加载和写入的进度……这会很快变得有点复杂,为了能够监控操作的进度,您需要知道Ima
提前谢谢你。所以,你需要两件事 首先,您需要某种方法来监控图像加载和写入的进度……这会很快变得有点复杂,为了能够监控操作的进度,您需要知道
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();
}
File File=新文件(“…”);
try(ImageInputStream iis=ImageIO.createImageInputStream(文件)){
迭代器阅读器=ImageIO.getImageReaders(iis);
if(readers.hasNext()){
ImageReader=readers.next();
reader.addioReadProgressListener(新的IIOReadProgressListener(){
@凌驾
已启动公共空序列(ImageReader源,int-minIndex){
}
@凌驾
public void sequenceComplete(ImageReader源){
}
@凌驾
public void ImageStart(ImageReader源,int imageIndex){
}
@凌驾
public void imageProgress(ImageReader源,浮点百分比完成){
//TODO:更新进度。。。
}
@凌驾
public void imageComplete(ImageReader源){
}
@凌驾
公共无效缩略图已启动(ImageReader源、int imageIndex、int thumbnailIndex){
}
@凌驾
公共无效缩略图进度(ImageReader源,浮点百分比完成){
}
@凌驾
public void thumbnailComplete(ImageReader源代码){
}
@凌驾
public void readAborted(ImageReader源){
}
});
reader.setInput(iis);
试一试{
BuffereImage img=读取器.read(0);
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
try(ImageOutputStream ios=ImageIO.createImageOutputStream(baos)){
迭代器编写器=ImageIO.getImageWritersByFormatName(“png”);
if(writers.hasNext()){
ImageWriter writer=writers.next();
writer.addioWriteProgressListener(新的IIOWriteProgressListener()){
@凌驾
public void ImageStart(ImageWriter源,int imageIndex){
}
@凌驾
public void imageProgress(ImageWriter源,浮点百分比完成){
//TODO:更新进度
}
@凌驾
public void imageComplete(ImageWriter源){
}
@凌驾
公共无效缩略图已启动(ImageWriter源、int imageIndex、int thumbnailIndex){
}
@凌驾
public void thumbnailProgress(ImageWriter源,浮点百分比完成){
}
@凌驾
public void thumbnailComplete(ImageWriter源代码){
}
@凌驾
public void writeableported(ImageWriter源){
}
});
writer.setOutput(ios);
试一试{
writer.write(img);
}最后{
writer.removeAllIIOWriteProgressListeners();
}
}
}
}最后{
reader.removeAllIIOReadProgressListeners();
}
}
}捕获(IOEXP异常){
exp.printStackTrace();
}
好的,现在您已经知道了,接下来需要的是在事件调度线程的上下文之外执行它,这样就不会阻塞UI,因此UI将保持响应,但是您还需要一种方法,可以轻松地更新UI而不违反单线程规则(对UI的更新必须在事件调度线程的上下文中完成)
为此,a非常适合
基本上,您可以使用doInBackground
方法来读/写映像,可以使用progress属性支持来更新进度指示器,也可以使用publish
/过程
方法来提供有关当前操作的其他信息
您甚至可以使用done
方法来处理当doInBackground
方法完成时需要更新UI的情况
谢谢!这太棒了:)
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();
}