[JAVA] Bildverarbeitung: Grundstruktur des vom Programm gelesenen Bildes

Einführung

Ein Bild, das sowohl in der Programmierung als auch auf Websites enthalten sein wird. Man kann jedoch mit Sicherheit sagen, dass niemand weiß, was der Computer tatsächlich im Inneren tut. Das Verstehen und Verwenden der Funktionsprinzipien aller elektronischen Geräte wie Kameras ist eine dumme Geschichte, und das Bild kann als dieselbe Geschichte bezeichnet werden. Wenn ich als Programmierer das Bild jedoch mit Code nach meinen Wünschen ändern kann, werden sich meine Träume wieder verbreiten, sodass ich in mehreren Teilen über die Bildverarbeitung sprechen möchte. Überlegen.

Bildstruktur

img.png

Bevor wir mit dem Bild herumspielen können, müssen wir herausfinden, wie die Struktur ist. Also habe ich ein Bild wie oben vorbereitet, aber es ist tatsächlich eine Bilddatei, die mit einem Programm erstellt wurde.

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;     //Bild breite
		int height = 100;    //Vertikales Bild
		int color = 0;       //1 Pixel Farbinformation
		int[] rgb = new int[width * height];        //Farbinformationen für das gesamte Bild
		BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
		
		for(int i = 0; i < height; i++) {
			for(int j = 0; j < width; j++) {
				//Bestimmen Sie die realen Koordinaten des Arrays
				int index = (i * width) + j;

				//Ändern Sie die Farbe abhängig von den Koordinaten
				//Farbinformationen werden hexadezimal gespeichert.
				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();
		}
	}
}

Wie oben erwähnt, ist es möglich, eine Bilddatei mit der BufferedImage-Klasse von Java zu generieren. Was hier wichtig ist, ist die Stelle, an der die Indexvariable verwendet wird, um die Koordinaten des Arrays und die Hexadezimalzahl zu erstellen, die vom Switch verteilt wird. Schauen wir uns jeden an.

Anordnung von Farbinformationen und realen Koordinaten

img.png

Wenn wir ein Bild betrachten, sehen wir immer ein quadratisches Bild. Die tatsächliche Farbe des Bildes ist jedoch kein zweidimensionales Array, sondern ein gewöhnliches Array, wie Sie im obigen Code sehen können. Anschließend wird einfach angezeigt, wie die Farben tatsächlich angezeigt werden, und zwar anhand der Breitenlänge, ohne die vertikale Länge zu berücksichtigen.

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

Die Farbe des tatsächlichen Bildes wird so angezeigt.

imageProcess01_1.java


for(int i = 0; i < height; i++) {
	for(int j = 0; j < width; j++) {
		//Bestimmen Sie die realen Koordinaten des Arrays
		int index = (i * width) + j;
	}
}

Wenn Sie daher die Breite und die vertikalen Koordinaten getrennt mit zwei für solche Anweisungen zählen, können die tatsächlichen Koordinaten des Arrays nicht ohne Verwendung der obigen Formel berechnet werden.

Struktur der Farbinformationen

Als nächstes wollen wir sehen, welche Art von Daten die Farbinformationen tatsächlich enthalten. Der Datentyp der Farbinformationen ist der Int-Typ. Die Kapazität, die der Int-Typ speichern kann, beträgt insgesamt 4 Byte. Diese ist jedoch in 1 Byte unterteilt, und jedes Byte speichert Informationen über die Farbe.

Alpha Red Green Blue
Undurchsichtigkeit rot Grün Blau
0 ~ 255 0 ~ 255 0 ~ 255 0 ~ 255

Es wird in dieser Reihenfolge ab dem ersten 1 Byte gespeichert und kann jeweils 0 bis 255, insgesamt 256 Daten, speichern. Und da die Zahl 255 nur FF ist, wenn sie hexadezimal ausgedrückt wird, ist es einfacher, sie hexadezimal zu steuern, wenn sie tatsächlich im Programm verwendet wird. Schauen wir uns anhand dieser Tabelle die Hexadezimalzahlen an, die in der obigen Quelle geschrieben sind.

imageProcess01_1.java


//Ändern Sie die Farbe abhängig von den Koordinaten
//Farbinformationen werden hexadezimal gespeichert.
switch(index / 2500) {
case 0: 	color = 0xFFFF0000; break;
case 1: 	color = 0xFF00FF00; break;
case 2: 	color = 0xFF0000FF; break;
default: 	color = 0xFF000000; break;
}

In Java werden alle Zahlen, die mit 0x beginnen, hexadezimal ausgedrückt. Und da 1Byte mit zwei Zeichen angezeigt wird, sieht es am Beispiel von Fall 0 wie folgt aus.

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

Die Deckkraft und das Rot betragen 255, was nicht transparentes Rot bedeutet. Da das Array 100 x 100 ist, sind die ersten 0 bis 2499 im 10000-Array rot. Die Farbe des Bildes kann so eingegeben werden.

Am Ende

Dies ist die grundlegende Bildstruktur, die das Programm lädt. Sobald Sie diese Struktur verstanden haben, können Sie das Bild leicht mit nur dem Code ändern, aber können Sie an irgendetwas denken? Vorläufig würde ich gerne über die eigentliche Bildverarbeitung sprechen, aber ich dachte, es wäre eine Schande, ohne Kenntnis der ersten Grundlagen einzutreten, also dachte ich, dass viele Leute es wissen, aber ich schrieb dies Ich tat.

In letzter Zeit gibt es viele praktische Bibliotheken usw., und es ist möglicherweise nicht möglich, eine solche Bildverarbeitungsfunktion direkt zu erstellen, aber der Grad des Verständnisses hängt davon ab, ob Sie das Prinzip kennen oder nicht. Ich denke, es wird genauso viel bewirken wie der Boden. Lassen Sie uns diese Gelegenheit nutzen, um eine einfache Bildverarbeitung selbst durchzuführen, ohne auf eine Bibliothek angewiesen zu sein. Bis zum nächsten Mal.

Recommended Posts

Bildverarbeitung: Grundstruktur des vom Programm gelesenen Bildes
Reihenfolge der Verarbeitung im Programm
Ein grundlegendes Verständnis des Flusses der rekursiven Verarbeitung anstreben
Verstehen Sie den grundlegenden Mechanismus von log4j2.xml
Ich habe die Quelle von ArrayList gelesen, die ich gelesen habe
Ich habe die Quelle von Integer gelesen
Ich habe die Quelle von Long gelesen
Ersetzen Sie die Vorschau durch Hochladen, indem Sie auf das Bild in file_field of Rails klicken
Grundlegender Verarbeitungsablauf von Java Stream
Ich habe die Quelle von Short gelesen
Ich habe die Quelle von Byte gelesen
Ich habe die Quelle von String gelesen
Bildverarbeitung: Spielen wir mit dem Bild
Grundstruktur des Java-Quellcodes
Webanwendungsstruktur nach Java und Verarbeitungsablauf in der Präsentationsschicht
Zeigen Sie Text über dem Bild an
Ich habe die interne Verarbeitung von Retrofit untersucht
Wie ist die Datenstruktur von ActionText?
Der Inhalt der von CarrierWave gespeicherten Daten.
Dateien zeilenweise lesen VS sofort lesen
Denkweise beim Studium grundlegender Programmkenntnisse
Zusammenfassung der Grundkenntnisse von Rails, die von progate erworben wurden
[Hinweis] Java: Geschwindigkeit der Verarbeitung der Liste nach Zweck
[Java / Kotlin] Ändern Sie die Größe unter Berücksichtigung der Ausrichtung des Bildes
Ändern Sie den Docker-Image- und Container-Platzierungsordner
[Java] Ganzzahlige Informationen von Zeichen in der Textdatei, die mit der Methode read () erfasst wurden
Zählen Sie die Häufigkeit des Auftretens von Wörtern in einem Satz durch Stream-Verarbeitung (Apache Apex).