【问题标题】:JAVA Writing Gray Scale JPEG Image (dependency on JDK version?)JAVA编写灰度JPEG图像(依赖JDK版本?)
【发布时间】:2012-10-22 02:44:11
【问题描述】:

我是 JAVA 语言的初学者,我需要使用代码(编写灰度 JPEG 图像)。 找了好久,还是不知道是什么问题。

public static boolean writeImage(String inputFileName, String outputFileName, int[][][] imageData)
{
    BufferedImage inputImage = MyImageReader.readImageIntoBufferedImage( inputFileName );
    if ( inputImage == null )
    {
        System.out.println(" Could not open input image.");
        return false;
    }

    BufferedImage outputImage = new BufferedImage( inputImage.getWidth(), inputImage.getHeight(),
                                                   inputImage.getType() );
    WritableRaster outputRaster, inputRaster;
    inputRaster = inputImage.getRaster();
    outputRaster = inputRaster.createCompatibleWritableRaster();

     int band = 0;
    int numbands = outputRaster.getNumBands();

    int height, width;
    height = outputRaster.getHeight();
    width = outputRaster.getWidth();
    int[] pixelData = new int[ 1 ];

    for ( int y = 0; y < height; y++ )
        for ( int x = 0; x < width; x++ )
        {
            for ( band = 0; band < 1; band++ )
            {
                pixelData[ 0 ] = imageData[0][y][x];
            }
            outputRaster.setPixel(x, y, pixelData );
        }

    outputImage.setData( outputRaster );

    File outputFile = new File( outputFileName );
    try
    {
        if ( !ImageIO.write( outputImage, "jpg", outputFile ))
        {
            System.out.println("Could not find image format for output image.");
            return false;
        }
    }
    catch ( Exception e )
    {
        System.out.println("Could not write output file.");
        return false;
    }

    return true;
}

我正在使用上面的代码。 该代码似乎通过从输入 jpeg 文件中复制属性来创建一个 WritableRaste, 所以输出的 jpeg 文件将具有相同的大小。

我正在做的是对灰度栅格值进行一些图像处理 并将其保存为 jpeg 文件。

当我用简单的 4x4 案例测试时,结果如下。

输入数组保存在(Height, Width)坐标中

1 2 3 4

5 6 7 8

15 16 17 18

25 26 27 28

当我加载保存的文件时,它显示在(高度,宽度)坐标中

2 3 4 5

3 4 5 6

15 15 16 17

25 26 27 28

这怎么可能?我无法弄清楚出了什么问题。 图像阅读器被证明是安全的。 我在 Oracle 的 JDK 1.7 上运行,但原始代码可能是过去编写的。 但我希望这不会是问题。

谢谢!

【问题讨论】:

  • 如果没有一些示例数据,我真的不能说。您调试并看到了吗?另外,为什么只有一次迭代的 for 循环? for ( band = 0; band &lt; 1; band++ ) { pixelData[ 0 ] = imageData[0][y][x]; }
  • 因为,原来的打算接受多个乐队,但我不需要它。所以我将它抑制为 0。我在 MATLAB 中使用 imwrite(Matrix, 'filename' 'jpg') 做了同样的事情,它显示了类似的结果。难道我做错了什么?我假设 Array[height][width] 可以保存为 jpg 文件(通过某些编码)
  • 问题必须在循环或传递给函数的数据中。据我所知,在循环中没有什么是错误的。但是不调试我很难说。
  • 你试过用调试器检查代码吗??
  • 我做的一件事是检查要传递的值,设置像素数据。我无法检查 imageBuffer(我必须学习如何去做)。但是我在 MATLAB 中遇到了同样的事情。我真的可以通过发送代表索引值的二维数组来编写灰度 jpeg 图像吗?

标签: java image-processing jpeg raster


【解决方案1】:

如果您能够使用 3rd 方库并决定利用 imgscalr(Apache 2,开源且微型 - 一类),您可以在实现过程中删除所有复杂代码,它看起来像这个:

import org.imgscalr.Scalr.*;

public static boolean writeImage(String inputFileName, String outputFileName)
{
    BufferedImage inputImage = MyImageReader.readImageIntoBufferedImage( inputFileName );
    if ( inputImage == null )
    {
        System.out.println(" Could not open input image.");
        return false;
    }

    // This replaces everything in the middle of your original impl.
    BufferedImage outputImage = apply(inputImage, Scalr.OP_GRAYSCALE);

    File outputFile = new File( outputFileName );
    try
    {
        if ( !ImageIO.write( outputImage, "jpg", outputFile ))
        {
            System.out.println("Could not find image format for output image.");
            return false;
        }
    }
    catch ( Exception e )
    {
        System.out.println("Could not write output file.");
        return false;
    }

    return true;
}

关键是apply 方法调用(将预定义的GRAYSCALE 操作应用于图像)。

【讨论】:

  • 感谢您的回答!但我发现即使我使用 Scalr 库,我也看到了相同的结果。我想做的很简单,将二维数组保存为 jpeg 文件。我假设 jpeg 文件会将 uint 值写入 2D 坐标给定的每个单元格。所以我希望如果我将值 255 分配给坐标 (0,0) 并保存它,那么当我下次加载它时,应该在 (0,0) 处检索相同的值,但事实并非如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2019-12-25
  • 2020-08-06
相关资源
最近更新 更多