标签: javax.imageio

将字节数组转换为Java中的图像 - 不知道类型

听起来很简单吧?使用

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没有直接查看标头的字节,并且没有任何人知道不同图像的字节标头的良好参考?

只是让你们知道我还在努力.如果/我有答案,我会通知你.到目前为止,我感谢你们所有人的回复.

java javax.imageio

13
推荐指数
1
解决办法
3万
查看次数

用于检测CMYK图像的JAI ImageIO的纯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图像?

提前致谢,

托马斯

java cmyk jai javax.imageio

13
推荐指数
2
解决办法
2万
查看次数

java.lang.IllegalArgumentException:input == null!使用ImageIO.read将图像加载为bufferedImage时

这是一个在这个网站上被问过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 bufferedimage javax.imageio

13
推荐指数
2
解决办法
3万
查看次数

如何在Java中检测损坏的图像(PNG,JPG)

我需要检测图像文件是否在Java中被破坏.我只使用PNG,JPG图像.这可能与Sanselan有关吗?或者可以用ImageIO完成吗?我尝试过使用ImageIO.read似乎很有效.但我不确定它是否可以检测到图像中的各种错误.我想知道什么是最好的做法.

java image javax.imageio

12
推荐指数
3
解决办法
1万
查看次数

无效的PNG图像文件:iDOT未指向有效的IDAT块

我在应用程序中有一些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个是中文,谷歌的翻译似乎没有很好的翻译.其他结果似乎是与我有同样问题的人,但没有回复他的帖子.

html png objective-c ipad javax.imageio

12
推荐指数
2
解决办法
1万
查看次数

ImageIO.read()始终旋转我上传的图片

我想创建一个允许用户将其图像上传到服务器的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 image multipartform-data spring-mvc javax.imageio

12
推荐指数
2
解决办法
5050
查看次数

使用Java和awt.Robot时提高屏幕捕获速度

编辑:如果任何人还有任何其他建议,以提高屏幕捕获性能,请随意分享,因为它可能完全解决我的问题!

你好开发者,

我正在为自己制作一些基本的屏幕捕获软件.截至目前,我已经获得了一些概念/修补代码的证明,它使用java.awt.Robot将屏幕捕获为BufferedImage.然后我执行此捕获指定的时间,然后将所有图片转储到磁盘.从我的测试中我得到大约每秒17帧.

试验#1

时长:15秒拍摄的图像:255

试验#2

时长: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)

java java-2d awtrobot javax.imageio

12
推荐指数
2
解决办法
6851
查看次数

如何使用Java中的tEXt或iTXt块保存PNG?

我目前正在使用javax.imageio.ImageIO来编写PNG文件.我想包括一个tEXt块(实际上是这里列出的任何块),但是看不到这样做的方法.

通过com.sun.imageio.plugins.png.PNGMetadata的外观,它应该是可能的.

我应该非常感谢任何线索或答案.

M.

java png text javax.imageio

11
推荐指数
1
解决办法
3973
查看次数

在没有I/O的情况下将BufferedImage转换为byte []

嗨我在内存中有一个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)方式?请指教.

java bufferedimage in-memory javax.imageio

11
推荐指数
2
解决办法
3985
查看次数

使用ImageIO在iOS上创建渐进式jpeg会在设备上产生块效果

我正在尝试从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.

iphone cocoa uiimage ios javax.imageio

11
推荐指数
1
解决办法
2084
查看次数