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.
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.
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.
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.
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