Tananyag‎ > ‎Java‎ > ‎

Kép pixeltömbként

A rasztergrafikus képek pixelekből állnak. Minden pixel három komponensből áll, pirosból, zöldből és kékből.

Egy színt többféle színrendszerben is lehet reprezentálni, a legegyszerűbb az RGB (Red Green Blue). Egy szín pontosan megfeleltethető egy RGB-számhármasnak, ahol a számok a piros, zöld és kék komponensek rendre. Minden komponens 0 és 255 közötti egész szám, ezért gyakran 16-os számrendszerben hivatkoznak rájuk.

Példa

RGB(243,21,103)=#F31567=

Javában

Két függvényt kell bemásolnunk a kódunkba, a read(fájlnév)-vel tudjuk a képet beolvasni, a write(fájlnév, pixels)-zel pedig kiírni. Érdemes PNG formátumot használni.

A képet egy int[][] kétdimenziós tömbben tároljuk el. A tömb h×w méretű, ahol h a kép magassága, w a szélessége. Egy pixel egy intként van ábrázolva, ami a pixel színének RGB alakja 16-os számrendszerben. 

Ilyen main függvénnyel tudjuk megváltoztatni #F31567 színűre a középső pixelt.

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

public class ImageEditor {

	public static void main(String[] args) {
		int[][] pixels = read("kep.png");
		int h = pixels.length,
				w = pixels[0].length;
		pixels[h/2][w/2] = 0xF31567; // #F31567 = rgb(243,21,103)
		write("kep2.png", pixels);
	}

	private static int[][] read(String path) {
		try {
			BufferedImage img = ImageIO.read(new File(path));
			int w = img.getWidth(),
					h = img.getHeight();
			int[][] out = new int[h][w];
			for(int i=0;i<w;++i)
				for(int j=0;j<h;++j)
					out[j][i] = img.getRGB(i,j);
			return out;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}

	private static void write(String path, int[][] pixels) {
		int h = pixels.length,
				w = pixels[0].length;
		BufferedImage img = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
		for(int i=0;i<w;++i)
			for(int j=0;j<h;++j)
				img.setRGB(i,j,pixels[j][i]);
		try {
			ImageIO.write(img,"png",new File(path));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}