Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将图像转换为字节数组时使用JProgressBar_Java_Swing_Jprogressbar - Fatal编程技术网

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

Java 将图像转换为字节数组时使用JProgressBar,java,swing,jprogressbar,Java,Swing,Jprogressbar,以下是将图像转换为字节数组的简单代码(已在本论坛中展示): 但是,当图像大小较大时,程序需要花费太多时间进行转换。因此,我考虑在GUI中添加一个JProgressBar,让用户知道还有多少时间。我所看到的所有示例都是使用循环处理JProgressBar的。我不知道如何从这里开始:(我可以有一个想法开始。换句话说,我应该把JProgressBar放在哪里 提前谢谢你。所以,你需要两件事 首先,您需要某种方法来监控图像加载和写入的进度……这会很快变得有点复杂,为了能够监控操作的进度,您需要知道Ima

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

但是,当图像大小较大时,程序需要花费太多时间进行转换。因此,我考虑在GUI中添加一个JProgressBar,让用户知道还有多少时间。我所看到的所有示例都是使用循环处理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();
}
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();
}