Java 如何加载位图图像并操作单个像素?

Java 如何加载位图图像并操作单个像素?,java,image,image-processing,bitmap,pixel,Java,Image,Image Processing,Bitmap,Pixel,我想从文件中加载一个大位图图像,运行一个处理单个像素的函数,然后重新保存位图 文件格式可以是PNG或BMP,操作功能很简单,例如: if r=200,g=200,b=200 then +20 on all values, else -100 on all values 诀窍是能够加载位图并能够逐行读取每个像素 Java中是否有标准的库机制可以处理此I/O (位图需要几百万像素,我需要能够处理数百万像素)多亏了MadProgrammer,我有了一个答案: package image_test;

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

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

if r=200,g=200,b=200 then +20 on all values, else -100 on all values
诀窍是能够加载位图并能够逐行读取每个像素

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


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

多亏了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 = 1; h<height; h++)
        {
            for (int w = 1; 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);
    }
}
package-image\u测试;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入javax.imageio.imageio;
公共类镜像测试{
公共静态void main(字符串[]args){
BuffereImage img=null;
试一试{
img=ImageIO.read(新文件(“test.bmp”);
}捕获(IOE异常){
}
int height=img.getHeight();
int width=img.getWidth();
int amountPixel=0;
int amountBlackPixel=0;
int rgb;
红色;
绿色;
蓝色;
百分之二像素=0;
System.out.println(高度+宽度+img.getRGB(30,30));
对于(inth=1;h16)&0x000000FF;
绿色=(rgb>>8)&0x000000FF;
蓝色=(rgb)&0x000000FF;
如果(红色==0&&绿色==0&&蓝色==0)
{
像素++;
}
}
}
percentPixel=(双)amountBlackPixel/(双)amountPixel;
System.out.println(“数量像素:“+amountPixel”);
System.out.println(“黑色像素数量:“+amountBlackPixel”);
System.out.println(“数量像素黑色百分比:+percentPixel”);
}
}

显示您尝试过的代码please@NikolayKuznetsov,我现在没有密码。我甚至无法将位图加载到Java中。首先看一看谢谢,我看了一下,并在下面发布了一个示例。许多年后,这种方法忽略了第一行和第一列像素。w&h的for循环初始值设定项应为=0,而不是=1。