我正在处理 Java 中的图像,我在本地磁盘中读取和写入图像。我的问题是在写图像时我失去了我阅读的实际图像的质量。它通过图像文件大小将质量从 6.19MB(实际图像大小)文件降低到 1.22MB(使用 ImageIO.write() 写入,这是巨大的损失。当我使用时如何防止这种损失
ImageIO.write(image, "jpg", os);
Run Code Online (Sandbox Code Playgroud)
用于写入图像。请记住,我在这里不需要任何压缩。只是我想读取图像并以相同的质量和相同的文件大小写入相同的图像。我也试过,
writer.write(null, new IIOImage(image, null, null), param);
Run Code Online (Sandbox Code Playgroud)
但它需要更多的执行时间并进行压缩过程。
请帮我解决这个问题。有没有机会写无损图像质量使用
ImageIO.write(image, "jpg", os);
Run Code Online (Sandbox Code Playgroud)
或任何其他方式?
提前致谢...!
我尝试使用显示图像JLabel。这是我的项目导航器:

我想SettingsDialog.java使用以下代码显示图像:
String path = "/images/sidebar-icon-48.png";
File file = new File(path);
Image image;
try {
image = ImageIO.read(file);
JLabel label = new JLabel(new ImageIcon(image));
header.add(label); // header is a JPanel
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
代码抛出异常:无法读取输入文件!
是不是图片路径不对?
BufferedImage image = ImageIO.read(new File(img path));
int width = image.getWidth();
int height = image.getHeight();
int[][] result = new int[height][width];
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
result[row][col] = image.getRGB(row, col);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的例外:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds!
at sun.awt.image.ByteInterleavedRaster.getDataElements(ByteInterleavedRaster.java:301)
at java.awt.image.BufferedImage.getRGB(BufferedImage.java:871)
at PlantExtraction.main(PlantExtraction.java:46)
Run Code Online (Sandbox Code Playgroud)
我怎样才能消除这些异常?
我正在使用以下代码将图像转换为 byte[]。
public static byte[] extractBytes (String ImageName) throws IOException {
ByteArrayOutputStream baos=new ByteArrayOutputStream();
BufferedImage img=ImageIO.read(new File(ImageName));
ImageIO.write(img, "jpg", baos);
return baos.toByteArray();
}
Run Code Online (Sandbox Code Playgroud)
现在当我测试我的代码时:
public static void main(String[] args) throws IOException {
String filepath = "image_old.jpg";
File outp=new File(filepath);
System.out.println("Size of original image="+outp.length());
byte[] data = extractBytes(filepath);
System.out.println("size of byte[] data="+data.length);
BufferedImage img = ImageIO.read(new ByteArrayInputStream(data));
//converting the byte[] array into image again
File outputfile = new File("image_new.jpg");
ImageIO.write(img, "jpeg", outputfile);
System.out.println("size of converted image="+outputfile.length());
}
Run Code Online (Sandbox Code Playgroud)
我得到了非常奇怪的结果:
Size of original …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
String nameAndPath = "C:\\example\\folder\\filename.png";
BufferedImage image = addInfoToScreenshot(); //this method works fine and returns a BufferedImage
ImageIO.write(image, "png", new File(nameAndPath));
Run Code Online (Sandbox Code Playgroud)
现在,该路径C:\example\folder\不存在,因此我收到抛出异常并显示消息:(The system cannot find the path specified)
如何让 ImageIO 自动创建路径,或者我可以使用什么方法自动创建路径?
在此代码的先前版本中,我使用 FileUtils.copyFile 来保存图像(以 File 对象的形式),这将自动创建路径。我怎样才能用这个复制它?我可以再次使用 FileUtils.copyFile,但我不知道如何将 BufferedImage 对象“转换”为 File 对象。
URL url = new URL(imageURL);
BufferedImage image = ImageIO.read(url);
Run Code Online (Sandbox Code Playgroud)
或者
URL url = new URL(imageURL);
BufferedImage image = ImageIO.read(url.openStream());
Run Code Online (Sandbox Code Playgroud)
结果图像为空?为什么?
在 Paint XP 或 Paint Windows 8 中,当您编写文本时,程序会自动提高字体质量(至少对于财务打印机而言)。我想知道如何使用下面相同的 Java 代码来做到这一点。
首先,看看这张图片,看看我的意思:

BufferedImage image = ImageIO.read(new File("blankdocument.bmp"));
Graphics g = ((BufferedImage) image).getGraphics();
Font helvetica = new Font("Lucida Sans Unicode", Font.PLAIN, 13);
g.setColor(Color.black);
g.setFont(helvetica);
g.drawString("TEXT WRITING EXAMPLE.", 5, 10);
ImageIO.write(image, "PNG", new File("testx.PNG"));
image.flush();
Run Code Online (Sandbox Code Playgroud) 我对使用 BufferedImage 对象的唯一担心是,对于非常大的图像(例如 60000x32000),它将导致 JVM 在有限的 JVM 堆空间上因 OOM 而关闭。然而,ImageIO.read方法的JavaDocs说了一些关于“控制缓存”的内容。
在这种情况下,什么是控制缓存?
这是否意味着 ImageIO.read 使用磁盘上的图像缓存来处理大图像?
参考下面的JavaDocs和ImageIO.read方法:
/**
* Returns a <code>BufferedImage</code> as the result of decoding
* a supplied <code>File</code> with an <code>ImageReader</code>
* chosen automatically from among those currently registered.
* The <code>File</code> is wrapped in an
* <code>ImageInputStream</code>. If no registered
* <code>ImageReader</code> claims to be able to read the
* resulting stream, <code>null</code> is returned.
*
* <p> The current cache settings from <code>getUseCache</code>and
* <code>getCacheDirectory</code> will be …Run Code Online (Sandbox Code Playgroud) 我对这个问题很困惑。我在 jai-imageio-core 上使用 1.3.0 版本,请检查下面的依赖关系,我完全无法从 jar 中找出一个类文件(RawImageReaderSpi)如何加载到 JVM 中,但未加载 RawImageInputStream。
我已经在 tomcat 7 容器中部署了我的 Spring Boot Web 服务。
这个问题是随机弹出的,我注意到当我重新启动 TC 容器并部署新版本的服务时,这个问题会间歇性地出现。
任何线索都受到高度赞赏。
我花了一天的时间试图找出问题所在,结果却觉得自己很愚蠢
<dependency>
<groupId>com.github.jai-imageio</groupId>
<artifactId>jai-imageio-core</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>com.github.jai-imageio</groupId>
<artifactId>jai-imageio-jpeg2000</artifactId>
<version>1.3.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
java.lang.NoClassDefFoundError: com/github/jaiimageio/stream/RawImageInputStream
在 com.github.jaiimageio.impl.plugins.raw.RawImageReaderSpi.canDecodeInput(RawImageReaderSpi.java:102) ~[jai-imageio-core-1.3.0.jar:1.3.0]
在 javax.imageio.ImageIO$CanDecodeInputFilter.filter(ImageIO.java:567) ~[na:1.8.0_121]
在 javax.imageio.spi.FilterIterator.advance(ServiceRegistry.java:821) ~[na:1.8.0_121]
在 javax.imageio.spi.FilterIterator.(ServiceRegistry.java:815) ~[na:1.8.0_121]
在 javax.imageio.spi.ServiceRegistry.getServiceProviders(ServiceRegistry.java:516) ~[na:1.8.0_121]
在 javax.imageio.ImageIO.getImageReaders(ImageIO.java:646) ~[na:1.8.0_121]
在 javax.imageio.ImageIO.read(ImageIO.java:1438) ~[na:1.8.0_121]
在 javax.imageio.ImageIO.read(ImageIO.java:1352) ~[na:1.8.0_121]
在 my-package.ab(a.java:155) ~[classes/:na]
在 my-package.ab(a.java:181) ~[classes/:na]
在 my-package.ab(a.java:84) ~[classes/:na]
在 my-package.a$$FastClassBySpringCGLIB$$5f66283f.invoke() ~[spring-core-4.1.3.RELEASE.jar:na]
在 org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在 org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) ~[spring-aop-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.1.3.RELEASE.jar:4.1.3.RELEASE] … 我的问题是,如何才能将.tif文件成功加载到Java中的Image实例中?
现在让我提供更多细节。我已经阅读了很多关于stackoverflow的关于如何在Java中处理/转换TIF图像的线程。我已经尝试了很多stackoverflow建议(我说建议,因为很少有人问他们回来说什么对他们有用)。我很确定我需要使用Java Advanced Imaging(JAI)库,但我认为我不知道如何使用它。现在让我解释一下该项目:
我正在从“处理”草图中获取帧的屏幕,然后使用Xuggler将其编码为视频。在草图中,我使用Processing的save(file filePath)函数将当前帧保存到文件中。我曾经有过save(“ img” + i +“。jpg”),但是创建jpg时发生的压缩将录制速度减慢到9-10fps,所以我切换了文件扩展名以查看是否可以改变结果,而save(“ img” + i“ .tif”)最快,我可以以22-23fps的速度录制。
处理可以将图像另存为.tif文件。但是遗憾的是,如果没有库,Java无法将.tif文件加载回去。我以前有代码:
Image img = Toolkit.getDefaultToolkit()。getImage(“ pics / img” + i +“。jpg”);
该行代码会将.jpg文件加载到img中,我会很好地对视频进行编码。但是这行代码(用tif而不是jpg):
Image img = Toolkit.getDefaultToolkit()。getImage(“ pics / img” + i +“。tif”);
将不会加载任何图像。我仍然可以使用Xuggler对视频进行编码,但是图像为空白,因此我认为此方法无法加载我的.tif文件。
我正在Windows 8计算机上使用Eclipse。任何帮助将不胜感激!