[JAVA] Traitement d'image: structure de base de l'image lue par le programme

introduction

Une image qui sera certainement incluse dans la création du programme et la création du site Web. Cependant, il est prudent de dire que personne ne sait ce que fait réellement l'ordinateur à l'intérieur. Comprendre et utiliser les principes de fonctionnement de tous les appareils électroniques tels que les caméras est une histoire stupide, et l'image peut être considérée comme la même histoire. Cependant, en tant que programmeur, si je peux modifier l'image à mon goût avec du code, mes rêves se répandront à nouveau, alors j'aimerais parler du traitement d'image en plusieurs parties. pense.

Structure d'image

img.png

Avant de pouvoir jouer avec l'image, nous devons comprendre à quoi ressemble la structure. Donc, j'ai préparé une image comme ci-dessus, mais il s'agit en fait d'un fichier image créé à l'aide d'un programme.

imageProcess01_1.java


import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class imageProcess01_1 {
	public static void main(String[] args) {
		int width = 100;     //Largeur de l'image
		int height = 100;    //Image verticale
		int color = 0;       //1 Informations sur la couleur des pixels
		int[] rgb = new int[width * height];        //Informations sur la couleur de l'image entière
		BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
		
		for(int i = 0; i < height; i++) {
			for(int j = 0; j < width; j++) {
				//Déterminez les coordonnées réelles du tableau
				int index = (i * width) + j;

				//Changer de couleur en fonction des coordonnées
				//Les informations de couleur sont enregistrées au format hexadécimal.
				switch(index / 2500) {
				case 0: 	color = 0xFFFF0000; break;
				case 1: 	color = 0xFF00FF00; break;
				case 2: 	color = 0xFF0000FF; break;
				default: 	color = 0xFF000000; break;
				}
				rgb[index] = color;
			}
		}
		
		img.setRGB(0, 0, width, height, rgb, 0, width);
		try {
			ImageIO.write(img, "png", new File("img.png "));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

Comme mentionné ci-dessus, vous pouvez générer un fichier image à l'aide de la classe BufferedImage de Java. Ce qui est important ici, c'est l'endroit où la variable d'index est utilisée pour créer les coordonnées du tableau et le nombre hexadécimal qui est distribué par le commutateur. Regardons chacun d'eux.

Disposition des informations de couleur et des coordonnées réelles

img.png

Lorsque nous regardons une image, nous voyons toujours une image carrée. Cependant, la couleur réelle de l'image n'est pas un tableau à deux dimensions, mais un tableau ordinaire, comme vous pouvez le voir dans le code ci-dessus. Ensuite, la façon dont les couleurs sont réellement affichées est simplement triée dans l'ordre en utilisant la longueur de largeur sans tenir compte de la longueur verticale.

0 1 2 3 4 ... ... ... ... 99
100 101 102 ... ... ... ... ... ... 199
200 201 202 ... ... ... ... ... ... 299
300 301 302 ... ... ... ... ... ... 399
400 401 402 ... ... ... ... ... ... 499
500 501 502 ... ... ... ... ... ... 599
600 601 602 ... ... ... ... ... ... 699
700 701 702 ... ... ... ... ... ... 799
800 801 802 ... ... ... ... ... ... 899
... ... ... ... ... ... ... ... ... ...
9900 9901 9902 ... ... ... ... ... ... 9999

La couleur de l'image réelle est affichée comme ceci.

imageProcess01_1.java


for(int i = 0; i < height; i++) {
	for(int j = 0; j < width; j++) {
		//Déterminez les coordonnées réelles du tableau
		int index = (i * width) + j;
	}
}

Par conséquent, lorsque vous comptez séparément la largeur et les coordonnées verticales en utilisant deux pour des instructions comme celle-ci, les coordonnées réelles du tableau ne peuvent pas être calculées sans utiliser la formule ci-dessus.

Structure des informations de couleur

Ensuite, voyons quel type de données contient réellement les informations de couleur. Le type de données des informations de couleur est le type Int. La capacité totale du type Int est de 4 octets, mais elle est divisée en 1 octet et chaque octet stocke des informations sur la couleur.

Alpha Red Green Blue
Opacité rouge vert Bleu
0 ~ 255 0 ~ 255 0 ~ 255 0 ~ 255

Il est enregistré dans cet ordre à partir du premier octet, et chacun peut enregistrer de 0 à 255, soit un total de 256 données. Et comme le nombre 255 est juste FF lorsqu'il est exprimé en hexadécimal, il est plus facile de le contrôler en hexadécimal lors de son utilisation dans le programme. Sur la base de ce tableau, jetons un coup d'œil aux nombres hexadécimaux écrits dans la source ci-dessus.

imageProcess01_1.java


//Changer de couleur en fonction des coordonnées
//Les informations de couleur sont enregistrées au format hexadécimal.
switch(index / 2500) {
case 0: 	color = 0xFFFF0000; break;
case 1: 	color = 0xFF00FF00; break;
case 2: 	color = 0xFF0000FF; break;
default: 	color = 0xFF000000; break;
}

En Java, tous les nombres commençant par 0x sont exprimés en hexadécimal. Et puisque 1Byte est affiché en utilisant deux caractères, si vous prenez le cas 0: à titre d'exemple, ce sera comme ça.

Alpha Red Green Blue
FF FF 00 00
255 255 00 00

L'opacité et le rouge sont de 255, ce qui signifie un rouge non transparent. Étant donné que le tableau mesure 100x100, les premiers 0 à 2499 du tableau 10000 seront rouges. La couleur de l'image peut être saisie comme ceci.

À la fin

Il s'agit de la structure d'image de base que le programme charge. Une fois que vous comprenez cette structure, vous pouvez facilement modifier l'image avec juste le code, mais pouvez-vous penser à quelque chose? Pour le moment, j'aimerais parler du traitement d'image réel, mais j'ai pensé que ce serait dommage d'entrer sans connaître les toutes premières bases, alors j'ai pensé que beaucoup de gens le savent, mais j'ai écrit ceci J'ai fait.

Récemment, il existe de nombreuses bibliothèques utiles, etc., et il n'est peut-être pas possible de créer directement une telle fonction de traitement d'image, mais le degré de compréhension dépend de la connaissance ou non du principe. Je pense que cela fera une différence autant que le terrain. Profitons de cette occasion pour faire un traitement d'image simple par vous-même sans compter sur une bibliothèque. À la prochaine.

Recommended Posts

Traitement d'image: structure de base de l'image lue par le programme
Ordre de traitement dans le programme
Viser une compréhension de base du flux de traitement récursif
Comprendre le mécanisme de base de log4j2.xml
J'ai lu la source de ArrayList que j'ai lu
J'ai lu la source d'Integer
J'ai lu la source de Long
Cliquez sur l'image dans le champ file_field de Rails pour télécharger et remplacer l'aperçu
Flux de traitement de base de Java Stream
J'ai lu la source de Short
J'ai lu la source de Byte
J'ai lu la source de String
Traitement d'image: jouons avec l'image
Structure de base du code source Java
Structure de l'application Web par Java et flux de traitement dans la couche de présentation
Afficher le texte en haut de l'image
J'ai étudié le traitement interne de Retrofit
Quelle est la structure des données d'ActionText?
Le contenu des données enregistrées par CarrierWave.
Lire les fichiers ligne par ligne VS lire à la fois
Façon de penser lors de l'étude des connaissances de base du programme
Résumé des connaissances de base des rails acquises par progate
[Note] Java: vitesse de traitement de la liste par objectif
[Java / Kotlin] Redimensionner en tenant compte de l'orientation de l'image
Modifier le dossier de placement de l'image et du conteneur Docker
[Java] Informations entières des caractères du fichier texte acquises par la méthode read ()
Compter la fréquence d'apparition des mots dans une phrase par traitement de flux (Apache Apex)