Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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 将ImageOutputStream转换为字节[]_Java_Image_Jai - Fatal编程技术网

Java 将ImageOutputStream转换为字节[]

Java 将ImageOutputStream转换为字节[],java,image,jai,Java,Image,Jai,已经尝试使用JAI将ImageOutputStream转换为字节[]。欢迎您的任何意见。谢谢 抱歉,这是代码片段,我正在处理。我得早点把它寄出去。我面临的问题是,我能够从ImageOutputStream获取ByteArrayOutputStream。但它总是给我零字节。但是如果我使用FileOutputStream而不是ByteArrayOuputStream,我可以写入一个非零字节的文件: File file = new File("C:/TIFFImages/tiff-image.tiff

已经尝试使用JAI将ImageOutputStream转换为字节[]。欢迎您的任何意见。谢谢

抱歉,这是代码片段,我正在处理。我得早点把它寄出去。我面临的问题是,我能够从ImageOutputStream获取ByteArrayOutputStream。但它总是给我零字节。但是如果我使用FileOutputStream而不是ByteArrayOuputStream,我可以写入一个非零字节的文件:

File file = new File("C:/TIFFImages/tiff-image.tiff");
FileInputStream in = new FileInputStream(file);
long filelength = file.length();
byte[] bytes = new byte[(int)filelength]; 
int offset = 0; 
int numRead = 0; 

while (offset < bytes.length && (numRead=in.read(bytes, offset, bytes.length-offset)) >= 0) { 
    offset += numRead; 
} 
if (offset < bytes.length) { 
    throw new IOException("Could not completely read file "+file.getName()); 
} 

ByteArrayInputStream bais = new ByteArrayInputStream(bytes);

RenderedImage src = JAI.create("stream", SeekableStream.wrapInputStream(bais, true));
RenderedOp renderedOp = MedianFilterDescriptor.create(src, MedianFilterDescriptor.MEDIAN_MASK_SQUARE , 1, null);
BufferedImage image = renderedOp.getAsBufferedImage();

ByteArrayOutputStream baos = new ByteArrayOutputStream();

ImageOutputStream  ios =  ImageIO.createImageOutputStream(baos);
//Instead of baos if I pass a FileOutputStream to the above function. It writes non zero
//bytes to the output file

TIFFImageWriterSpi tiffspi = new TIFFImageWriterSpi();
ImageWriter writer = tiffspi.createWriterInstance();
RenderedImage renderedImage = PlanarImage.wrapRenderedImage(src);
writer.setOutput(ios);
writer.write(image);
writer.write(null,new IIOImage(image, null, null), param);

System.out.println("After tiff ImageIO operations" + baos.toByteArray().length);
File File=new文件(“C:/TIFFImages/tiff image.tiff”);
FileInputStream in=新的FileInputStream(文件);
long filelength=file.length();
字节[]字节=新字节[(int)文件长度];
整数偏移=0;
int numRead=0;
而(偏移量=0){
偏移量+=numRead;
} 
if(偏移量<字节长度){
抛出新IOException(“无法完全读取文件”+file.getName());
} 
ByteArrayInputStream bais=新的ByteArrayInputStream(字节);
renderImagesrc=JAI.create(“stream”,见kablestream.wrapInputStream(bais,true));
renderop renderop=MedianFilterDescriptor.create(src,MedianFilterDescriptor.MEDIAN\u MASK\u SQUARE,1,null);
BuffereImage=renderop.getasBuffereImage();
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
ImageOutputStream ios=ImageIO.createImageOutputStream(BAS);
//如果我将FileOutputStream传递给上述函数,则不使用BAS。它写的不是零
//将字节添加到输出文件中
TIFFImageWriterSpi tiffspi=新的TIFFImageWriterSpi();
ImageWriter writer=tiffspi.createWriterInstance();
RenderImageRenderImageRenderImagePlanarimage.wrapRenderedImage(src);
writer.setOutput(ios);
作家。写作(形象);
writer.write(null,新IIOImage(image,null,null),param);
System.out.println(“在tiff ImageIO操作之后”+baos.toByteArray().length);
谢谢,
Vinay

嗯,您将无法从输出流中读取

您应该尝试从图像对象获取
InputStream
,并从中读取必要的数据

但是,如果您提供更多关于您实际努力实现目标的详细信息,我们可以帮助您更高效地完成任务。:)


例如,如果您只想以字节为单位显示图像的大小,还有其他几种方法。

我得到了答案,这与纪尧姆的建议非常接近。除了不需要写入中间的临时文件。以下是将ImageOutputStream转换为字节[]的修改代码:

ByteArrayOutputStream baos = new ByteArrayOutputStream(37628);
ImageOutputStream  ios =  ImageIO.createImageOutputStream(baos);

//Instead of baos if I pass a FileOutputStream to the above function. It writes non zero
//bytes to the output file

TIFFImageWriterSpi tiffspi = new TIFFImageWriterSpi();
ImageWriter writer = tiffspi.createWriterInstance();
RenderedImage renderedImage = PlanarImage.wrapRenderedImage(src);
writer.setOutput(ios);
writer.write(image);
writer.write(null,new IIOImage(image, null, null), param);

//Create a ByteArrayInputStream to read that ByteArrayOutputStream and read it from ImageIO

ByteArrayInputStream bai = new ByteArrayInputStream(baos.toByteArray());
RenderedImage out = ImageIO.read(bai);
int size = bos.toByteArray().length;

System.out.println(""+ size);

return bos.toByteArray

使用ByteArrayOutputStream(而不是FileOutputStream)创建ImageOutputStream

完成图像处理后,“ios”对象中的图像字节将可用,但偏移量将位于“ios”对象的末尾。因此,我们需要将偏移量定位到“ios”对象的开头,然后读取要写入新ByteArrayOutputStream对象的字节。最后从新对象返回toByteArray()。如下图所示:

        public byte[] getBytes(ImageOutputStream ios) {
            ByteArrayOutputStream bos = new ByteArrayOutputStream(255);
            byte imageByte;
            long counter = 0; 
            try {
                    System.out.println("getStreamPosition()[BEFORE]=" + ios.getStreamPosition());
                    ios.seek(0);
                    System.out.println("getStreamPosition()[AFTER]=" + ios.getStreamPosition());
            } catch (IOException e1) {                       
                    e1.printStackTrace();
            }

            while (true) {
                    try {
                            bos.write(ios.readByte());
                            counter++;
                    } catch (EOFException e) {
                            System.out.println("End of Image Stream");
                            break;
                    } catch (IOException e) {
                            System.out.println("Error processing the Image Stream");
                            break;
                    }
            }
            System.out.println("Total bytes read=" + counter);
            byte[] retValue = bos.toByteArray();
            return retValue;
    }

我很确定这是因为您在操作结束时没有调用
ImageOutputStream.flush()
——如果创建的IOS是
MemoryCacheOutputStream
,似乎需要对某些ImageIO实现进行显式刷新。

您能澄清一下吗?您是否正在尝试转换以前在IOS中编写的内容?我不是尝试从输出流读取内容,而是希望将输出写入ByteArrayOutputStream。正如我在代码注释中提到的。FileOutputStream在写入时提供非零大小。但是ByteArrayOutputStream给出的大小为零。我正在尝试压缩TIFF图像,并从此代码返回一个字节[]。糟糕,我读取您的代码太快了。您是否尝试在执行时(即使用Eclipse)逐步检查程序以检查ByteArrayOutputStream的状态?在最坏的情况下,您可以在临时文件中吐出它,并使用ByteArrayInputStream读取它。但是很脏,是的。当我在调试模式下逐步浏览代码时,字节数组大小在初始化后永远不会超过零。虽然临时文件的创建可能会起作用,但在这段代码中,我无法承担这样做的费用。它必须返回一个字节数组,中间没有任何文件I/O。我找到了另一种压缩图像的方法。然而,如果这种方法奏效,情况会更好。这让我有点困惑,谢谢。你现在是我的英雄我一直在想为什么我的底层ByteArrayOutputStream总是空的。刷新ImageOutputStream解决了所有问题。谢谢我已经挣扎了很长一段时间,不知怎的我找到了你的答案。刷新ImageOutputStream修复了它。请查看findjar.com,它也适用于类未找到异常。
        public byte[] getBytes(ImageOutputStream ios) {
            ByteArrayOutputStream bos = new ByteArrayOutputStream(255);
            byte imageByte;
            long counter = 0; 
            try {
                    System.out.println("getStreamPosition()[BEFORE]=" + ios.getStreamPosition());
                    ios.seek(0);
                    System.out.println("getStreamPosition()[AFTER]=" + ios.getStreamPosition());
            } catch (IOException e1) {                       
                    e1.printStackTrace();
            }

            while (true) {
                    try {
                            bos.write(ios.readByte());
                            counter++;
                    } catch (EOFException e) {
                            System.out.println("End of Image Stream");
                            break;
                    } catch (IOException e) {
                            System.out.println("Error processing the Image Stream");
                            break;
                    }
            }
            System.out.println("Total bytes read=" + counter);
            byte[] retValue = bos.toByteArray();
            return retValue;
    }