Hi ich habe in der schule als "Projekt" mit 2 weiteren Mitschülern die Aufgabe in einem bild die pixel die aneinanderliegen zu vergleichen ob diese die gleiche farbe haben und wenn ja dann sollen sie weiß gefärbt werden ansatz mithilfe meines lehrers war es zunächst einmal halt das bild einzulesen und den header auszulesen und die bilddaten des originals auch einzulesen es handelt sich hierbei um ein bmp bild mit 24bit also 3byte pro pixel nur wie vergleiche ich jetzt umliegende pixel in einem array und danach noch muss das ganze gespiechert werden
Bisheriger Code:
Bisheriger Code:
Java:
import java.io.*;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
/**
* @author Tobias M
* @version 2.2 17.11.2016
*/
public class Rhinozelfant {
byte Original[][];
int width;
int hight;
byte Eingefaerbt[][];
boolean gefunden[][];
public int liesBMHeader(RandomAccessFile fin, RandomAccessFile fout) throws IOException{
// Zeigt nur wichtige Informationen und setzt width und hight!!!!
// gibt Headerlänge zurück, zugegeben etwas kompliziert!
/* Aus Wikipedia
* BITMAPFILEHEADER (Größe: 14 Byte)
* Offset (Byte) Datentyp Größe Name Inhalt
* Dez Hex Windows-Style C-Style
* 0 0 WORD uint16_t 2 Byte bfType ASCII-Zeichenkette "BM" (Hex: 0x4D42, Dezimal: 19778).
* 2 2 DWORD uint32_t 4 Byte bfSize Größe der BMP-Datei in Byte. (unzuverlässig)
* 6 6 DWORD uint32_t 4 Byte bfReserved Reserviert, von der Software abhängig, standardmäßig 0
* 10 A DWORD uint32_t 4 Byte bfOffBits Offset der Bilddaten in Byte vom Beginn der Datei ist nicht immer 54 Byte groß (14 Byte Header + 40 Byte Infoblock).
* Daher muss dieser Wert dynamisch ausgelesen und verwendet werden. Ignorierung dieser Angabe führt ggf. zu Fehldarstellungen im Bild.
* BITMAPINFOHEADER (Größe: 40 Byte)
* Offset (Byte) Datentyp Größe Name Inhalt
* Dez Hex Windows-Style C-Style
* 14 E DWORD uint32_t 4 Byte biSize Größe der BITMAPINFOHEADER-Struktur in Byte
* 18 12 LONG int32_t 4 Byte biWidth Breite der Bitmap in Pixel.
* 22 16 LONG int32_t 4 Byte biHeight Der Betrag gibt die Höhe der Bitmap in Pixel an.
* Ist der Wert positiv, so ist die Bitmap eine sogenannte "bottom-up"-Bitmap (die Bilddaten beginnen mit der untersten und enden mit der obersten Bildzeile). Dies ist die gebräuchlichste Variante.
* Ist der Wert negativ, so ist die Bitmap eine "top-down"-Bitmap (die Bilddaten beginnen mit der obersten und enden mit der untersten Bildzeile).
* 26 1A WORD uint16_t 2 Byte biPlanes 1 (Stand in einigen älteren Formaten wie PCX für die Anzahl der Farbebenen, wird aber für BMP nicht verwendet)
* 28 1C WORD uint16_t 2 Byte biBitCount Gibt die Farbtiefe der Bitmap in bpp an; muss einer der folgenden Werte sein: 1, 4, 8, 16, 24 oder 32. Bei 1, 4 und 8 bpp sind die Farben indiziert.
* 30 1E DWORD uint32_t 4 Byte biCompression Einer der folgenden Werte:
* 0 (BI_RGB): Bilddaten sind unkomprimiert.
* 1 (BI_RLE8): Bilddaten sind lauflängenkodiert für 8 bpp. Nur erlaubt wenn biBitCount=8 und biHeight positiv.
* 2 (BI_RLE4): Bilddaten sind lauflängenkodiert für 4 bpp. Nur erlaubt wenn biBitCount=4 und biHeight positiv.
* 3 (BI_BITFIELDS): Bilddaten sind unkomprimiert und benutzerdefiniert (mittels Farbmasken) kodiert. Nur erlaubt wenn biBitCount=16 oder 32.
* 34 22 DWORD uint32_t 4 Byte biSizeImage
* Wenn biCompression=BI_RGB: Entweder 0 oder die Größe der Bilddaten in Byte.
* Ansonsten: Größe der Bilddaten in Byte.
* 38 26 LONG int32_t 4 Byte biXPelsPerMeter Horizontale Auflösung des Zielausgabegerätes in Pixel pro Meter; wird aber für BMP-Dateien meistens auf 0 gesetzt.
* 42 2A LONG int32_t 4 Byte biYPelsPerMeter Vertikale Auflösung des Zielausgabegerätes in Pixel pro Meter; wird aber für BMP-Dateien meistens auf 0 gesetzt.
* 46 2E DWORD uint32_t 4 Byte biClrUsed
* Wenn biBitCount=1: 0.
* Wenn biBitCount=4 oder 8: die Anzahl der Einträge der Farbtabelle; 0 bedeutet die maximale Anzahl (2, 16 oder 256).
* Ansonsten: Die Anzahl der Einträge der Farbtabelle (0=keine Farbtabelle). Auch wenn sie in diesem Fall nicht notwendig ist,
* kann dennoch eine für die Farbquantisierung empfohlene Farbtabelle angegeben werden.
* 50 32 DWORD uint32_t 4 Byte biClrImportant
* Wenn biBitCount=1, 4 oder 8: Die Anzahl sämtlicher im Bild verwendeten Farben; 0 bedeutet alle Farben der Farbtabelle.
* Ansonsten:
* Wenn eine Farbtabelle vorhanden ist und diese sämtliche im Bild verwendeten Farben enthält: deren Anzahl.
* Ansonsten: 0.
*/
byte[] bfType; bfType = new byte[2];
byte[] buf; buf=new byte[4]; /* wegen der umgedrehten Darstellung von Zahlen unter DOS/INTEL und JAVA */
int bfSize, bfReserved, bfOffbits, biSize, biWidth, biHight;
fin.read(bfType);
fin.read(buf);
bfSize = buf[3]*16777216+buf[2]*65536+buf[1]*256+buf[0]; // 2 hoch 8 ist 256, entsprechend die anderen Zahlenwerte
bfReserved = fin.readInt(); //nicht relevant
fin.read(buf);
bfOffbits = buf[3]*16777216+buf[2]*65536+buf[1]*256+buf[0];
biSize= fin.readInt(); // nicht relevant
fin.read(buf);
biWidth = buf[3]*16777216+buf[2]*65536+buf[1]*256+buf[0];
fin.read(buf);
biHight = buf[3]*16777216+buf[2]*65536+buf[1]*256+buf[0];
System.out.println("Information: bfType bfSize bfOffbits biWidth biHight");
System.out.println(""+(char)bfType[0]+(char)bfType[1]+" "+bfSize+" "+ bfOffbits+" "+ biWidth+" "+ biHight);
System.out.println("Daraus ergibt sich eine Bildpunktgröße von :" + (double)(bfSize-bfOffbits)/(double)(biWidth*biHight) + " Byte");
hight=biHight;
width=biWidth;
return bfOffbits;
}
public void schreibeBMHeaderNachFout(RandomAccessFile fin, RandomAccessFile fout, int headerLaenge) throws IOException{
byte[] header=new byte[headerLaenge];
fin.read(header);
fout.write(header);
}
public void Rhinozelfant(String dateiname) throws IOException {
RandomAccessFile fin = new RandomAccessFile(dateiname, "r");
RandomAccessFile fout = new RandomAccessFile("Eingefaerbt.bmp", "rw");
int headerLaenge=liesBMHeader(fin,fout); //lese bild_breite und höhe aus!
fin.close(); // wir setzen FD zurück
fin = new RandomAccessFile(dateiname, "r");
schreibeBMHeaderNachFout(fin,fout,headerLaenge);
Original = new byte[width][hight]; // WIESO INT?
Eingefaerbt = new byte[width][hight];
// Sie haben noch gar keine Verbindung zwischen dem Array Original und fin!!!!
//z.B.
byte[][] myOriginal = new byte[hight][width*3];
byte[] buf= new byte[width*3];
for (int i=0; i < hight; i++)
{
fin.read(buf);
for (int j=0; j < width*3; j++)
{
myOriginal[i][j]=buf[j];
fout.write(myOriginal[i][j]); //nur Testausgabe!!! --- Achtung Sie können die Datei nicht lesen, wenn BLUEJ noch aktiv ist.
}
}
// ACHTUNG IMMER 3 BYTE GEHÖREN ZUSAMMEN - VIELLEICHT WAREN SIE MIT IHRER RGB-SICHT DOCH AUF EINEM GUTEN WEG - Aber das mit dem Header brauchen Sie!!
/* for(int y = 1; y < hight; y++)
{
for(int x = 1; x < width; x++)
{
if (myOriginal[x][y] == myOriginal[x][y-1])
{
Eingefaerbt[x][y] = 0;
}
else if(myOriginal[x][y] == myOriginal[x-1][y])
{
Eingefaerbt[x][y] = 0;
}
else if(myOriginal[x][y] == myOriginal[x][y+1])
{
Eingefaerbt[x][y] = 0;
}
else if(myOriginal[x][y] == myOriginal[x+1][y])
{
Eingefaerbt[x][y] = 0;
}
else
{
Eingefaerbt[x][y] = myOriginal[x][y];
}
}
}
for(int y = 1; y < hight; y++)
{
for(int x = 1; x < width; x++)
{
fout.write(Eingefaerbt[x][y]);
}
}
*/
fin.close();
fout.close();
}
}