标签: javax.imageio

使用Java ImageIO进行Tiff压缩

我在将png转换为tiff时遇到问题.转换很顺利,但图像很大.我认为问题是我没有正确进行压缩?任何人都有任何建议?

这是代码示例

public static void test() throws IOException {

    // String fileName = "4958813_1";
    String fileName = "4848970_1";
    String inFileType = ".PNG";
    String outFileType = ".TIFF";

    ImageIO.scanForPlugins();

    File fInputFile = new File("I:/HPF/UU/" + fileName + inFileType);
    InputStream fis = new BufferedInputStream(new FileInputStream(
            fInputFile));
    PNGImageReaderSpi spi = new PNGImageReaderSpi();
    ImageReader reader = spi.createReaderInstance();

    ImageInputStream iis = ImageIO.createImageInputStream(fis);
    reader.setInput(iis, true);
    BufferedImage bi = reader.read(0);

    TIFFImageWriterSpi tiffspi = new TIFFImageWriterSpi();
    ImageWriter writer = tiffspi.createWriterInstance();
    //Iterator<ImageWriter> iter =  ImageIO.getImageWritersByFormatName("TIFF");
    //ImageWriter writer = iter.next();

    ImageWriteParam …
Run Code Online (Sandbox Code Playgroud)

java compression tiff image javax.imageio

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

压缩JPG使图像变为绿色

当我尝试压缩jpg图像时,大多数情况下它完美地工作,但是一些jpg图像在压缩后变为绿色.这是我的代码

public void compressImage(String filename, String fileExtension) {
    BufferedImage img = null;
    try {
        File file = new File(filename);
        img = ImageIO.read(file);

        if (fileExtension.toLowerCase().equals(".png") || fileExtension.toLowerCase().equals(".gif")) {
            //Since there might be transparent pixel, if I dont do this,
            //the image will be all black.
            for (int x = 0; x < img.getWidth(); x++) {
                for (int y = 0; y < img.getHeight(); y++) {
                    int rgb = img.getRGB(x, y);
                    int alpha = (rgb >> 24) & 0xff;
                    if (alpha != …
Run Code Online (Sandbox Code Playgroud)

java compression jpeg image-compression javax.imageio

6
推荐指数
1
解决办法
1437
查看次数

Java BufferedImage使用不需要的背景颜色进行保存

提前谢谢你的帮助

描述:程序绘制,显示和保存图像.它的工作原理如下:对象本身扩展了Frame.在构造函数中,该对象创建一个BufferedImage,并调用一个绘制到该图像上的方法.然后,它将图像显示在帧上.最后,它将图像保存到文件中(我不关心它使用的是什么格式).主程序创建对象,其余部分完成.

问题:保存的文件始终具有彩色背景!由于显示的图像很好,这尤其奇怪.如果我在ImageIO.write()中使用"jpg"格式,背景会偏红.如果我使用"png"格式,背景为深灰色.

我花了一段时间在这上面,我仍然不知道到底发生了什么!

    import java.awt.Frame ;
    import java.awt.image.BufferedImage ;
    import java.io.IOException ;
    import java.awt.event.WindowEvent ;
    import java.awt.event.WindowAdapter ;
    import java.awt.Toolkit ;
    import java.awt.Graphics2D ;
    import java.awt.Graphics ;
    import java.awt.Color ;
    import java.awt.Dimension ;
    import javax.imageio.ImageIO ;
    import java.io.File ;
    import java.awt.geom.Rectangle2D;

    public class HGrapher extends Frame{
       private BufferedImage img ;
       private float colors[][] ; //the colors for every rectangle
       private double availWidth ;
       private double availHeight ;


       public HGrapher(String saveFileName, int numRects) throws IOException {
          //*add window closer
          addWindowListener(new …
Run Code Online (Sandbox Code Playgroud)

java swing bufferedimage graphics2d javax.imageio

6
推荐指数
1
解决办法
5690
查看次数

Java从URL挂起读取图像

我正试图通过java中的URL从互联网上获取图像.我正在使用以下代码.

URL url = new URL(webAddress);
image = ImageIO.read(url);
Run Code Online (Sandbox Code Playgroud)

有时它可以工作,有时它只是无限期挂起,具体取决于WebAddress是什么.没有错误消息,它只是继续运行,什么都不做.

通过将它们复制并粘贴到Web浏览器中来确认,它们永远挂起的地址肯定有图像.似乎没有哪种模式可以运行,哪些不运行 - 它们都是jpeg.我已经做了一些搜索并找到了一些从URL获取图像的其他方法,但同样的事情发生在所有这些 - 它们处理一些图像并挂在其他图像上.

你知道是什么原因造成这种情况,以及如何解决这个问题?

java url javax.imageio

6
推荐指数
1
解决办法
2896
查看次数

Eclipse bug:javax.imageio.IIOException:无法读取输入文件

以下代码在BlueJ IDE中成功运行,但在Eclipse中未成功运行.

String path="images/pic1.jpg";

BufferedImage myPicture = null;
    try {
        myPicture = ImageIO.read(new File(path));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

我的图像路径在IDE中都是相同的.另外,我观察到*.class文件和图像文件的目录结构是相同的.

为什么只在eclipse中发生这种情况?

java eclipse javax.imageio

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

组合BG为JPEG的图像会导致意外结果

为什么组合BG为JPEG的图像会导致意外结果?

这是我在2个图像的覆盖中无法正常工作的答案的后续行动.在那里发布的源(使用在内存中创建的BG图像)看起来像这样:

  • BG图像位于左侧.
  • FG图像(具有透明度的PNG)位于中间.
  • 合并后的图像位于右侧.

到现在为止还挺好.但是那个问这个问题的人评论说如果BG是JPEG,那就失败了.认为他们错了,我改变了我的例子,将BG图像编码为JPEG.现在,如果我使用BufferedImage.TYPE_INT_ARGBBufferedImage.TYPE_INT_RGB为最终图像我得到他们所指的:

TYPE_INT_ARGB

使用支持透明度的最终图像组合图像

TYPE_INT_RGB

使用不支持透明度的最终图像组合图像

我期望结果与至少其中一个的原始结果相同(更多的是ARGB变体).

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.net.URL;
import javax.imageio.ImageIO;

class CombineImages {

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                try {
                    URL urlImage1 =
                        new URL("http://i.stack.imgur.com/T5uTa.png");

                    // Load the FG image
                    Image fgImage = ImageIO.read(urlImage1);
                    int w = fgImage.getWidth(null);
                    int h = fgImage.getHeight(null);
                    // Create a …
Run Code Online (Sandbox Code Playgroud)

java image javax.imageio

6
推荐指数
1
解决办法
280
查看次数

转换并显示字节数组中的图像

我正在制作一个程序,它从服务器获取有关字节数组中图像的数据.我正在将这些数据转换为24位BMP格式(无论是jpeg,png,bmp还是8-24-32bpp).首先,我将它保存到我的HD,然后我将它加载到JLabel的Icon中.虽然在某些情况下我得到以下异常,但效果很好:

java.io.EOFException at
javax.imageio.stream.ImageInputStreamImpl.readFully(ImageInputStreamImpl.java:353) at
com.sun.imageio.plugins.bmp.BMPImageReader.read24Bit(BMPImageReader.java:1188) at
com.sun.imageio.plugins.bmp.BMPImageReader.read(BMPImageReader.java:843) at
javax.imageio.ImageIO.read(ImageIO.java:1448) at 
javax.imageio.ImageIO.read(ImageIO.java:1308)
Run Code Online (Sandbox Code Playgroud)

这条线(第二条)

File imgFile = new File("d:/image.bmp");
BufferedImage image = ImageIO.read(imgFile);
Run Code Online (Sandbox Code Playgroud)

在这些情况下:

  • 图像没有加载到JLabel中,但它可以在我的HD上找到
  • 转换不合适,因为某些事情"滑倒"
  • 图片就像在word文档中使用斜体

首先,我认为也许bpp是问题,然后我认为可能图片太大,但我有案例它的工作和案例它不适用于这两个建议.我有点卡在这里,并且很乐意提出想法.

java swing image javax.imageio

6
推荐指数
1
解决办法
4万
查看次数

Java 8 ImageIO在Linux中错误地读取JPEG

我正在尝试阅读用户上传的JPEG图像(任意)以在服务器应用程序中创建缩略图.系统在Windows7/Oracle Java 8u11中工作得很好,但我在服务器上的CentOS下有颜色模型的问题:

原始图片是:

http://studio-st.ru/media/portfolio/image/45

在Windows下的开发工作站上生成的缩略图绝对正确

Linux下的结果是颜色偏移的(Java 8u05上带红色,Java 8u11上有颜色偏移).这里没有提供,因为原始示例在现场,现在已修复.

更深入的调查显示问题在于读取图像 - Windows和Linux上的ImageIO.read(inputStream)返回具有完全相同参数的图像对象,但是同一图像(刚刚读取)的颜色探针getRGB(x,y)返回不同的值.

Linux中的颜色​​在Java 8u05和8u11上有所不同,8u05是"红色",8u11如上所示.

这与alpha通道无关 - 这个特殊的源图像是JPEG Type 5(TYPE_3BYTE_BGR),从Adobe Lightroom导出并转换为sRGB,没有任何其他技巧.

这也会影响当时导出的所有图像(事实上,此网站上的所有图像).

任何人都可以提供一些有关如何使其工作的建议(除了等待JDK的修复)?也许推荐备用库,可以在这里使用(EJB,存储在MongoDB中的数据,因此使用InputStreams获取数据 - 无文件系统访问).

谢谢!

UPD:问题似乎与Java8的新色彩管理模块有关 - 它不了解这种图像格式.切换到旧版CMM解决了这个问题.请在下面的正确评论中查看详细信息

java image-processing java-8 javax.imageio

6
推荐指数
1
解决办法
1406
查看次数

Java - 缩放图像的正确方法

上下文

我正在审查服务器端应用程序中用于扩展图像的一些遗留Java代码.直到最近它主要用于具有1024x768或更低分辨率的输入图像,并且在这种情况下它似乎运行良好(或者至少足够好).

然而,现在,许多被操纵的图像的分辨率范围从2592x1936(8MP)到6000x4000(24MP).这导致OutOfMemoryError在服务器上频繁报告,我认为这是由图像处理代码引起的.

测试用例

我把一个简单的测试应用程序放在一起,调用图像处理代码的方式与服务器相同(有一点需要注意;测试用例是单线程的,而服务器环境显然不是这样):

public static void main(String[] args) throws Exception {
    File file = new File("test_fullres.png");     //8MP test image, PNG format
    for (int index = 0; index < 1000; index++) {
        File output = new File("target/images/img_" + index + ".jpg");
        verifyImageIsValidAndScale(file, output, 1024, 768, true, 80);

        if (index % 10 == 0) {
            String memStats = "Memstats after " + index + " iterations:";
            memStats += "\tFree Memory:  " + (Runtime.getRuntime().freeMemory() / 1024.0 / 1024.0) + …
Run Code Online (Sandbox Code Playgroud)

java memory garbage-collection image javax.imageio

6
推荐指数
0
解决办法
776
查看次数

使用 ImageIO.write 写入 jpg 或 jpeg 图像不会创建图像文件

我以最小的形式重新创建了这个问题:

主要的:

public class ImageIOMain extends Application {

    @Override
    public void start(Stage stage) throws Exception{
        Scene scene = new Scene(new StackPane(), 800.0, 600.0);

        stage.setScene(scene);
        stage.show();

        WritableImage img = scene.snapshot(null);

        //Image file created on desktop
        ImageIO.write(SwingFXUtils.fromFXImage(img, null), "png", new File("D:\\Desktop\\test.png"));

        //Image file NOT created on desktop
        ImageIO.write(SwingFXUtils.fromFXImage(img, null), "jpeg", new File("D:\\Desktop\\test.jpeg"));
    }

    public static void main(String[] args) {
        launch(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

重要提示:我使用的是 JavaFX 12。

如果我png在图像显示在我的桌面上时导出图像。例如,如果文件格式为 ,jpeg则不会创建图像。

过去,当我使用 JavaFX 8 保存时,jpeg使用上述代码会导致图像变成粉红色。现在在版本 12 中没有任何反应。

那么我怎样才能创建一个不是格式png …

jpeg javafx javax.imageio

6
推荐指数
1
解决办法
1806
查看次数