【问题标题】:How can I load a bitmap image and manipulate individual pixels?如何加载位图图像并操作单个像素?
【发布时间】:2013-05-04 17:42:46
【问题描述】:

我想从文件加载单个大位图图像,运行一个处理单个像素的函数,然后重新保存位图。

文件格式可以是PNG或BMP,操作函数很简单,例如:

if r=200,g=200,b=200 then +20 on all values, else -100 on all values

诀窍是能够加载位图并能够逐行读取每个像素

Java 中是否有可以处理这种 I/O 的标准库机制?

(位图需要几百万像素,我需要能够处理几百万像素)

【问题讨论】:

  • 请显示您尝试过的代码
  • @NikolayKuznetsov,我目前没有代码。我什至无法将位图加载到 Java 中。
  • 谢谢,我看了一下并在下面发布了一个示例。

标签: java image image-processing bitmap pixel


【解决方案1】:

感谢 MadProgrammer,我有一个答案:

package image_test;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Image_test {

    public static void main(String[] args) {
        BufferedImage img = null;
        try {
            img = ImageIO.read(new File("test.bmp"));
        } catch (IOException e) {
            
        }
        int height = img.getHeight();
        int width = img.getWidth();
        
        int amountPixel = 0;
        int amountBlackPixel = 0;
        
        int rgb;
        int red;
        int green;
        int blue;
        
        double percentPixel = 0;

        System.out.println(height  + "  " +  width + " " + img.getRGB(30, 30));
        
        for (int h = 0; h<height; h++)
        {
            for (int w = 0; w<width; w++)
            {
                amountPixel++;
                
                rgb = img.getRGB(w, h);
                red = (rgb >> 16 ) & 0x000000FF;
                green = (rgb >> 8 ) & 0x000000FF;
                blue = (rgb) & 0x000000FF;
                
                if (red == 0 && green == 0 && blue == 0)
                {
                    amountBlackPixel ++;
                }
            }
        }
        percentPixel = (double)amountBlackPixel / (double)amountPixel;
        
        System.out.println("amount pixel: "+amountPixel);
        System.out.println("amount black pixel: "+amountBlackPixel);
        System.out.println("amount pixel black percent: "+percentPixel);
    }
}

【讨论】:

  • 多年后,但这种方法错过了第一行和第一列像素。 w & h 的 for 循环初始化器应该是 = 0,而不是 = 1。
猜你喜欢
  • 2013-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 2011-12-01
相关资源
最近更新 更多