听起来很简单吧?使用
ImageIO.read(new ByteArrayInputStream(bytes));
Run Code Online (Sandbox Code Playgroud)
这是皱纹.由于某种原因,它将jpeg检测为bmp,这是我调用时返回的第一个ImageReader
ImageInputStream iis = ImageIO.createImageInputStream(new ByteArrayInputStream(bytes));
Iterator<ImageReader> readers=ImageIO.getImageReaders(iis);
Run Code Online (Sandbox Code Playgroud)
这会导致图像损坏.有没有办法告诉java没有直接查看标头的字节,并且没有任何人知道不同图像的字节标头的良好参考?
只是让你们知道我还在努力.如果/我有答案,我会通知你.到目前为止,我感谢你们所有人的回复.
首先,我想解释导致问题的情况/要求:
在我们的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图像?
提前致谢,
托马斯
这是一个在这个网站上被问过100次的问题,但是我已经查看了所有这些问题,即使它们都已经解决了,但没有一个解决方案适合我.
这是我的代码的样子:
public Button1(Client client, String imgName) {
this.client = client;
try {
this.icon = ImageIO.read(this.getClass().getResourceAsStream("/resources/" + imgName));
} catch (IOException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
代码运行时会导致以下错误:
Exception in thread "main" java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
字符串imgName从子类传递给构造函数,并且是图像的名称(例如image.png).我还确保我的资源文件夹位于项目文件夹的根目录中,并作为源文件夹包含在eclipse项目中.我也确保System.getProperty("user.dir")
指向正确的位置.我也尝试使用getResource()而不是getResourceAsStream(),但它仍然不起作用.
我需要检测图像文件是否在Java中被破坏.我只使用PNG,JPG图像.这可能与Sanselan有关吗?或者可以用ImageIO完成吗?我尝试过使用ImageIO.read似乎很有效.但我不确定它是否可以检测到图像中的各种错误.我想知道什么是最好的做法.
我在应用程序中有一些HTML内容页面,我正在使用UIWebView来显示它们.其中一些页面中有一个PNG图像,它在xcode的调试控制台中生成以下消息:
ImageIO: PNG invalid PNG file: iDOT doesn't point to valid IDAT chunk
Run Code Online (Sandbox Code Playgroud)
图像仍然显示并且看起来正确.这也只有在我在iPad(第3代)上运行应用程序时才会发生.我的iPhone 4不显示此消息.
我的第一个想法是它是由文件名中的〜字符引起的(我已经将~ipad标签添加到文件名中).但是,删除〜字符没有任何影响.
我做了谷歌搜索,但我只得到了3个结果.其中2个是中文,谷歌的翻译似乎没有很好的翻译.其他结果似乎是与我有同样问题的人,但没有回复他的帖子.
我想创建一个允许用户将其图像上传到服务器的Web应用程序.当他们点击发送时,他们的图像将被上传到服务器(多部分).在保存之前,我想对图像进行一些操作,所以我决定使用..
ImageIO.read(InputStream的)
获取BufferedImage对象
这是代码:
public static BufferedImage getBufferedImageFromMultipartFile(MultipartFile file)
throws APIException
{
BufferedImage bi = null;
try
{
bi = ImageIO.read(file.getInputStream());
}
catch (IOException e)
{
throw new APIException(ErrorCode.SERVER_ERROR, e);
}
return bi;
}
Run Code Online (Sandbox Code Playgroud)
问题是当我尝试上传高度超过宽度的图片(如3264 x 2448(高x宽))时,结果始终是已旋转的图像(2448 x 3264).
有没有解决这个问题的方案?
这是一个错误还是任何已定义的API规范?
谢谢.
PS.对不起我的英文:D
编辑:如果任何人还有任何其他建议,以提高屏幕捕获性能,请随意分享,因为它可能完全解决我的问题!
你好开发者,
我正在为自己制作一些基本的屏幕捕获软件.截至目前,我已经获得了一些概念/修补代码的证明,它使用java.awt.Robot将屏幕捕获为BufferedImage.然后我执行此捕获指定的时间,然后将所有图片转储到磁盘.从我的测试中我得到大约每秒17帧.
时长:15秒拍摄的图像:255
时长:15秒图像捕获:229
显然,这对于真正的屏幕捕获应用程序来说还不够好.特别是因为这些捕获只是在我的IDE中选择一些文本而没有任何图形密集的文本.
我现在有两个班级是Main类和一个"Monitor"类.Monitor类包含捕获屏幕的方法.我的Main类有一个基于时间的循环,它调用Monitor类并将它返回的BufferedImage存储到BufferedImages的ArrayList中.如果我修改我的主类来生成几个执行该循环的线程,并且还收集有关捕获图像的系统时间的信息,我可以提高性能吗?我的想法是使用一个共享数据结构,它将在插入时基于捕获时间自动对帧进行排序,而不是将连续图像插入到arraylist中的单个循环.
码:
public class Monitor {
/**
* Returns a BufferedImage
* @return
*/
public BufferedImage captureScreen() {
Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
BufferedImage capture = null;
try {
capture = new Robot().createScreenCapture(screenRect);
} catch (AWTException e) {
e.printStackTrace();
}
return capture;
}
}
Run Code Online (Sandbox Code Playgroud)
public class Main {
public static void main(String[] args) throws InterruptedException {
String outputLocation = "C:\\Users\\ewillis\\Pictures\\screenstreamer\\";
String namingScheme = "image";
String mediaFormat = "jpeg";
DiscreteOutput output …
Run Code Online (Sandbox Code Playgroud) 我目前正在使用javax.imageio.ImageIO来编写PNG文件.我想包括一个tEXt块(实际上是这里列出的任何块),但是看不到这样做的方法.
通过com.sun.imageio.plugins.png.PNGMetadata的外观,它应该是可能的.
我应该非常感谢任何线索或答案.
M.
嗨我在内存中有一个BufferedImage实例,并希望将其转换为byte []以编码为base64字符串而不进行I/O操作以提高性能.我使用以下API:
ByteArrayOutputStream baos = new ByteArrayOutputStream ();
ImageIO.write(image,"png",baos);
return baos.toByteArray();
Run Code Online (Sandbox Code Playgroud)
但是,此API仍隐式将映像写入OS临时目录,如果底层OS临时目录已满并且无法创建临时文件,则会导致失败.堆栈跟踪:
Caused by: java.io.IOException: No space left on device
at java.io.RandomAccessFile.write(RandomAccessFile.java:493)
at javax.imageio.stream.FileCacheImageOutputStream.write(FileCacheImageOutputStream.java:134)
at javax.imageio.stream.ImageOutputStreamImpl.write(ImageOutputStreamImpl.java:66)
at com.sun.imageio.plugins.png.PNGImageWriter.write_magic(PNGImageWriter.java:376)
at com.sun.imageio.plugins.png.PNGImageWriter.write(PNGImageWriter.java:1115)
at javax.imageio.ImageWriter.write(ImageWriter.java:628)
at javax.imageio.ImageIO.write(ImageIO.java:1480)
at javax.imageio.ImageIO.write(ImageIO.java:1554)
Run Code Online (Sandbox Code Playgroud)
在没有I/O的情况下进行转换是否有效(如内存转换或高效I/O)方式?请指教.
我正在尝试从UIImage
对象创建渐进式jpeg ,这是我的代码
NSMutableData *data = [NSMutableData data];
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent: @"Library/Caches/test.jpg"];
CFURLRef url = CFURLCreateWithString(NULL, (CFStringRef)[NSString stringWithFormat:@"file://%@", path], NULL);
CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypeJPEG, 1, NULL);
CFRelease(url);
NSDictionary *jfifProperties = [NSDictionary dictionaryWithObjectsAndKeys:
(__bridge id)kCFBooleanTrue, kCGImagePropertyJFIFIsProgressive,
nil];
NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat:.7], kCGImageDestinationLossyCompressionQuality,
jfifProperties, kCGImagePropertyJFIFDictionary,
nil];
CGImageDestinationAddImage(destination, ((UIImage*)object).CGImage, (__bridge CFDictionaryRef)properties);
CGImageDestinationFinalize(destination);
CFRelease(destination);
Run Code Online (Sandbox Code Playgroud)
这在模拟器中运行时效果很好,但不幸的是在设备上产生了粗糙/块状结果:
关于发生了什么的任何想法?我将恢复使用UIImageJPEGRepresentation
作为最后的手段,我真的需要渐进式JPEG.