我希望能够将动画GIF作为输入,计算帧(以及可能的其他元数据),并将每个转换为a BufferedImage
.我怎样才能做到这一点?
我正在创建一个应用程序,它是一种图库 - 它将不同的媒体内容显示为全屏查看器.分配工具显示使用应用程序时,实时字节参数不会超过40 Mb.与此同时,在我将页面滑动20-30次后,应用程序被100%杀死.我检查了Dirty Memory参数,发现它比Live Bytes大小大10倍.并且大部分脏内存消耗了Image IO:
截图http://i40.tinypic.com/25ge51i.jpg
编辑,另一个截图:
截图http://i40.tinypic.com/9t1mh5.png
上面的分配峰值是切换视频/图像媒体内容.问题是脏内存几乎呈线性增长,我需要以某种方式释放它.
关于应用程序设计.应用程序屏幕有一个水平滚动视图.滚动视图包含包含多个图像的视频或拼贴对象.为了节省内存,一次只创建三个页面 - 当前页面和左/右页面.因此,在滚动滚动视图时,总是会创建和删除页面.
我使用[UIImage imageWithContentOfFile: path]
方法加载的所有图像.Collage对象在imagesArray中存储UIImage实例.在dealloc方法中,清除了图像轮廓属性.
所以,问题:
[UIImage imageWithContentOfFile?]
对于有点模糊的标题道歉,我无法弄清楚关键字在这里是什么.设置非常简单,我打开图像
ImageIO.read(new File(filename));
Run Code Online (Sandbox Code Playgroud)
这适用于大多数文件,但是对于一个我得到的文件IllegalArgumentException with the detail: "numbers of source Raster bands and source color space components do not match"
.这个图像是通过wget在有效的Flickr URL上获得的,并且我使用了这种方式获得的其他图像,因此获取图像的方法原则上看起来很合理.我不确定导致异常的是什么.
一个解决方法将是可以接受的 - 我ImageIO
特别不喜欢使用,并且图像在视觉上看起来很好.我只需要在没有Java吓坏的情况下阅读它!
这是有问题的图像,如果有任何用处:
所以我正在创建一个应用程序来存储所有用户最喜欢的应用程序的快捷方式,就像集线器一样.我可以支持实际文件,我有一个.lnk
解析器用于快捷方式.我认为应用程序支持Internet快捷方式也是相当不错的.这就是我正在做的事情:
假设我正在尝试获取Google的图标(http://www.google.com/favicon.ico
).
我开始摆脱额外的页面(例如,www.google.com/anotherpage
将成为www.google.com
.
然后,我ImageIO.read(java.net.URL)
用来获取图像.
问题是,ImageIO
当我调用此方法时,永远不会返回Image:
String trimmed = getBaseURL(page); //This removes the extra pages
Image icon = null;
try {
String fullURLString = trimmed + "/favicon.ico";
URL faviconURL = new URL(fullURLString);
icon = ImageIO.read(faviconURL);
} catch (IOException e) {
e.printStackTrace();
}
return icon;
Run Code Online (Sandbox Code Playgroud)
现在我有两个问题:
ImageIO
无法从URL读取?先感谢您!
我试图以编程方式在Java中设置jpeg图像的dpi元数据.图像的来源是扫描仪,因此我从TWAIN获得水平/垂直分辨率以及图像原始数据.我想保存此信息以获得更好的打印效果.
这是我到目前为止的代码.它将原始图像(byteArray)保存为JPEG文件,但忽略了我通过IIOMetadata指定的X/Ydensity信息.我有什么建议我做错了吗?
任何其他解决方案(第三方库等)也会受到欢迎.
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.File;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.ImageOutputStream
import org.w3c.dom.Element;
import com.sun.imageio.plugins.jpeg.JPEGImageWriter;
public boolean saveJpeg(int[] byteArray, int width, int height, int dpi, String file)
{
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
WritableRaster wr = bufferedImage.getRaster();
wr.setPixels(0, 0, width, height, byteArray);
try
{
// Image writer
JPEGImageWriter imageWriter = (JPEGImageWriter) ImageIO.getImageWritersBySuffix("jpeg").next();
ImageOutputStream ios = ImageIO.createImageOutputStream(new File(file));
imageWriter.setOutput(ios);
// Compression
JPEGImageWriteParam jpegParams = (JPEGImageWriteParam) imageWriter.getDefaultWriteParam();
jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
jpegParams.setCompressionQuality(0.85f);
// …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个100%Java的库,可以用jpeg无损压缩解码JPEG图像.
我知道ImageIO和JAI已经可以对这些图像进行解码,但它们需要一个本机代码,而这些代码并不适用于所有操作系统.
我会考虑开源和关闭源解决方案,如ImageIO插件或独立.
使用imageIO,我经常遇到转换图像文件的问题,在覆盖它之后,它会丢失所有的EXIF数据.有没有办法保留它而不首先提取它,缓存它,然后重置它?
我正在开发一个Android应用程序,可以对存储在手机中的图像进行Gamma校正.我的活动可以获取图像位置,但我不能在我的应用程序中使用 BufferedImage
类和ImageIO
类.
我在使用ADT插件的Eclipse IDE中收到以下错误.
ImageIO cannot be Resolved
BufferedImage cannot be Resolved
Run Code Online (Sandbox Code Playgroud)
我无法处理图像.我有一个想法,包括java库,但我不知道如何在Android中这样做
这是我需要使其工作的功能.
private static BufferedImage gammaCorrection(BufferedImage original, double gamma) {
int alpha, red, green, blue;
int newPixel;
double gamma_new = 1 / gamma;
int[] gamma_LUT = gamma_LUT(gamma_new);
BufferedImage gamma_cor = new BufferedImage(original.getWidth(), original.getHeight(), original.getType());
for(int i=0; i<original.getWidth(); i++) {
for(int j=0; j<original.getHeight(); j++) {
// Get pixels by R, G, B
alpha = new Color(original.getRGB(i, j)).getAlpha();
red = new Color(original.getRGB(i, j)).getRed();
green = new Color(original.getRGB(i, …
Run Code Online (Sandbox Code Playgroud) 我有一个来自图像文件的数据URL,必须将其传递给另一个函数.沿着从Data-URL到BufferedImage的这条路径,它需要是一个byteArray.
我的方法如下:
String dataUrl;
byte[] imageData = dataUrl.getBytes();
// pass the byteArray along the path
// create BufferedImage from byteArray
BufferedImage inputImage = ImageIO.read(new ByteArrayInputStream(imageData));
// If the picture is null, then throw an unsupported image exception.
if (inputImage == null) {
throw new UnknownImageFormatException();
}
Run Code Online (Sandbox Code Playgroud)
问题是,它总是抛出UnknownImageFormatException异常,这意味着inputImage为null,这意味着,ImageIO.read无法识别imagetype.
我使用ImageIO.getReaderFormatNames()来获取支持的文件名并得到以下列表:
Supported Formats:
jpg, BMP, bmp, JPG, jpeg, wbmp, png, JPEG, PNG, WBMP, GIF, gif
Run Code Online (Sandbox Code Playgroud)
我尝试传递的dataURL就像:data:image/png;base64,...
或data:image/jpg;base64,...
据我了解,这些都在受支持的文件列表中,因此应该得到认可.
在这种情况下,还有什么可能导致inputImage为null?更有趣的是,我该如何解决?
首先,我想解释导致问题的情况/要求:
在我们的Web应用程序中,我们无法支持CMYK图像(JPEG),因为IE 8及以下版本无法显示它们.因此,我们需要检测何时有人想要上传这样的图像并拒绝它.
不幸的是,Java的ImageIO不会读取这些图像,也不会使我无法获得检测到的色彩空间.从调试开始,JPEGImageReader
内部似乎得到了颜色空间代码11(这意味着JCS_YCCK
),但我无法安全地访问该信息.
当查询读者的图像类型时,我没有得到任何CMYK,所以我可能会假设no image types = unsupported image
.
我使用成像工具将源CMYK图像转换为RGB,以便测试它是否可读(我在尝试获取"无CMYK支持"消息时尝试模拟管理员的步骤).但是,JPEGImageReader
不会读取该图像,因为它假定(在源中注释!)3分量RGB颜色空间,但图像标题报告4个组件(可能是RGBA或ARGB),因此IllegalArgumentException
抛出了一个.
因此,ImageIO不是一个选项,因为我无法可靠地获取图像的色彩空间,我无法告诉管理员为什么不能接受由于某些内部的精细图像(它可以由浏览器显示)错误.
这让我尝试了JAI ImageIO,它CLibJPEGImageReader
做得非常出色并正确读取了我所有的测试图像.
但是,由于我们将应用程序部署在可能托管其他应用程序的JBoss中,因此我们希望尽可能保持它们的隔离.据我所知,我需要JAI ImageIO的安装到JRE或以其他方式使本机库提供,以使用它们,因此,其他应用程序可能访问到它们为好,这可能会导致副作用(至少我们不得不测试很多,以确保不是这种情况).
这就是问题的解释,这里再次出现: JAI ImageIO是否有任何纯Java替代品可以可靠地检测并可能转换CMYK图像?
提前致谢,
托马斯