首次使用Java处理图像,并得到一些未记录得很好的奇怪异常.这是失败的代码行:
BufferedImage imgSelected = ImageIO.read(new File("/abs/url/to/file/image.jpg"));
Run Code Online (Sandbox Code Playgroud)
这一行抛出了一个IIOException,其中不支持的图像类型作为异常消息.我检查并重新检查它实际上是这行引发异常,File对象是有效的,URL是有效的,并且image.jpg
实际上是一个有效的JPG,在其他图像查看器中加载完全正常.
我该怎么做才能获得有关此异常性质的更多信息?这是在Java 7中加载图像的传统方式,还是旧的/弃用方法?关于这些"不支持的图像类型"异常的信息并不是很多,当然,ImageIO支持JPG!
谢谢你的帮助!
我目前正在使用以下代码将像素值数组(最初使用java.awt.image.PixelGrabber对象创建)转换为Image对象:
public Image getImageFromArray(int[] pixels, int width, int height) {
MemoryImageSource mis = new MemoryImageSource(width, height, pixels, 0, width);
Toolkit tk = Toolkit.getDefaultToolkit();
return tk.createImage(mis);
}
Run Code Online (Sandbox Code Playgroud)
是否可以使用ImageIO软件包中的类来实现相同的结果,因此我不必使用AWT工具包?
Toolkit.getDefaultToolkit()似乎不是100%可靠,有时会抛出一个AWTError,而ImageIO类应该始终可用,这就是为什么我有兴趣改变我的方法.
给定一些源文件(或更通用的 - 输入流),我需要找出答案
我查看了API,但目前尚不清楚如何获取图像类型或Exif数据.
有没有人设法说服ImageIO写一个动画GIF,特别是设置正确的元数据?我的第一次尝试大致如下(其中b1和b2是BufferedImages):
ImageTypeSpecifier spec = new ImageTypeSpecifier(b1);
ImageWriter wr = ImageIO.getImageWriters(spec, "GIF").next();
wr.setOutput(ImageIO.createImageOutputStream(new File("C:\\Flashing.gif")));
ImageWriteParam param = wr.getDefaultWriteParam();
IIOMetadata meta = wr.getDefaultImageMetadata(spec, param);
wr.prepareWriteSequence(meta);
wr.writeToSequence(new IIOImage(b1, null, null), param);
wr.writeToSequence(new IIOImage(b2, null, null), param);
Run Code Online (Sandbox Code Playgroud)
这似乎几乎可行,但是:
如果有人从ImageIO编写动画GIF,可以分享工作代码片段或如何解决上述问题,我们将不胜感激!
我不知道如何处理TIFF图像,但我无法使用直接Java标准ImageIO库来读取或写入任何图像.有什么想法吗?
谢谢.
在后台线程中,我的应用程序需要从磁盘读取图像,将它们缩小到屏幕大小(1024x768或2048x1536)并将它们保存回磁盘.原始图像主要来自相机胶卷,但其中一些可能具有较大的尺寸(例如3000x3000).
稍后,在不同的线程中,这些图像将经常缩小到500x500左右的不同大小并再次保存到磁盘.
这让我想知道:在iOS,性能和内存方面,最有效的方法是什么?我使用了两种不同的API:
CGImageSource
和CGImageSourceCreateThumbnailAtIndex
从ImageIO;CGBitmapContext
并将结果保存到磁盘CGImageDestination
.两者都适合我,但我想知道他们在性能和内存使用方面是否有任何差异.如果有更好的选择,当然.
我正在尝试使用HTTP :: get从我创建的URL下载Google图表的图像.
这是我的第一次尝试:
failures_url = [title, type, data, size, colors, labels].join("&")
require 'net/http'
Net::HTTP.start("http://chart.googleapis.com") { |http|
resp = http.get("/chart?#{failures_url")
open("pie.png" ,"wb") { |file|
file.write(resp.body)
}
}
Run Code Online (Sandbox Code Playgroud)
其中只生成一个空的PNG文件.
对于我的第二次尝试,我使用failure_url
了http.get()
调用内部存储的值.
require 'net/http'
Net::HTTP.start("http://chart.googleapis.com") { |http|
resp = http.get("/chart?chtt=Builds+in+the+last+12+months&cht=bvg&chd=t:296,1058,1217,1615,1200,611,2055,1663,1746,1950,2044,2781,1553&chs=800x375&chco=4466AA&chxl=0:|Jul-2010|Aug-2010|Sep-2010|Oct-2010|Nov-2010|Dec-2010|Jan-2011|Feb-2011|Mar-2011|Apr-2011|May-2011|Jun-2011|Jul-2011|2:|Months|3:|Builds&chxt=x,y,x,y&chg=0,6.6666666666666666666666666666667,5,5,0,0&chxp=3,50|2,50&chbh=23,5,30&chxr=1,0,3000&chds=0,3000")
open("pie.png" ,"wb") { |file|
file.write(resp.body)
}
}
Run Code Online (Sandbox Code Playgroud)
并且,出于某种原因,即使第一次尝试在http.get()
调用中具有相同的数据,此版本仍然有效.有人知道为什么吗?
解:
在试图弄清楚为什么会发生这种情况后,我发现" 如何通过HTTP下载二进制文件? ".
其中一条评论提到http://
在Net::HTTP.start(...)
电话会议中删除,否则将无法成功.我这样做之后果然:
failures_url = [title, type, data, size, colors, labels].join("&")
require 'net/http'
Net::HTTP.start("chart.googleapis.com") { |http|
resp = http.get("/chart?#{failures_url")
open("pie.png" ,"wb") { |file| …
Run Code Online (Sandbox Code Playgroud) 我能够读取png文件.但是在读取gif文件时获取ArrayIndexOutOfBoundsException:4096.
byte[] fileData = imageFile.getFileData();
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileData);
RenderedImage image = ImageIO.read(byteArrayInputStream)
Run Code Online (Sandbox Code Playgroud)
抛出的异常看起来像
java.lang.ArrayIndexOutOfBoundsException: 4096
at com.sun.imageio.plugins.gif.GIFImageReader.read(Unknown Source)
at javax.imageio.ImageIO.read(Unknown Source)
at javax.imageio.ImageIO.read(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
可能是什么问题,解决方案是什么?
我们正在使用Java2D调整上传到我们网站的照片的大小,但是我们遇到了一个问题(一个看似旧的问题,参见:http://forums.sun.com/thread.jspa?threadID = 5425569) - 一些特殊的JPEG CMMException
当我们尝试ImageIO.read()
包含其二进制数据的InputStream 时引发a :
java.awt.color.CMMException: Invalid image format
at sun.awt.color.CMM.checkStatus(CMM.java:131)
at sun.awt.color.ICC_Transform.<init>(ICC_Transform.java:89)
at java.awt.image.ColorConvertOp.filter(ColorConvertOp.java:516)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.acceptPixels(JPEGImageReader.java:1114)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImage(Native Method)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1082)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:897)
at javax.imageio.ImageIO.read(ImageIO.java:1422)
at javax.imageio.ImageIO.read(ImageIO.java:1326)
...
Run Code Online (Sandbox Code Playgroud)
(剪断了堆栈跟踪的剩余部分,这是我们的ImageIO.read()
调用,servlet代码等)
我们将其缩小到特定相机拍摄的照片,然后我选择了一张触发此错误的照片:http://img214.imageshack.us/img214/5121/estacaosp.jpg.我们注意到这只发生在Sun的JVM上(在Linux和Mac上,只是在1.6.0_20上进行了测试) - 一台带有OpenJDK的测试机器可以顺利读取相同的照片,这可能是由于JPEG阅读器的不同实现.
不幸的是,我们无法在生产中切换JVM,也无法使用ImageMagick(http://www.imagemagick.org/)等本机相关解决方案.
考虑到这一点,我的问题是:是否存在可以处理链接照片之类的照片的ImageIO JPEG读取器的替代品?如果没有,我们可以使用另一个100%纯Java照片大小调整解决方案吗?
谢谢!
我搜索JAI和ImageIO库64位窗口,但我没有找到任何版本的这些.6-7年前,Java Bug跟踪系统的最后64位获胜请求.
我想,jai的开发者不会发布win64的任何版本.:(
我的问题是,我们可以从64bit窗口的源代码构建jai和imageio,这可能吗?怎么样?
非常感谢...