Witam,
Mam do przygotowania program, który będzie ładować plik w formacie PGM, zliczać x,y resolution i zapisywać w tabeli. Na razie doszedłem do zapisania wszystkich pikseli obrazka w tabeli metody pixtab. Pozostaje problem wczytania każdego w pętli i zamiany wartości na odwrotne z przedziału 256 kolorów tak aby powstał negatyw. Na razie doszedłem do zamiany, której nie potrafię zaimplementować w kod
byte [] public
int bufor,
int k;
bufor=(int)piksele(k);
bufor=bufor+128;
bufor=255-bufor; //powstaje negatyw
bufor=bufor-128,
piksle[k]=(byte)bufor;
Kod pierwotny
package lena;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
class PGMImage {
protected int xres;// zmienna chroniona
public int getXresolution ()
{
return xres;// zwraca wartość (rozdzielczość x)
}
protected int yres;
public int getYresolution ()
{
return yres;// zwraca rozdzielczość
}
protected byte[] pt=null; //tworzymy tablice, null to brak adresu fizycznego w pamieci,
public byte[] pixTab()//metoda, która zwraca adres poczatku tablicy z pikselami
{
return pt;// zwraca piksele
}
private int[] readHeader(String fileName) throws IOException {// private to największy status ochrony, metoda czytająca nagłowek i zbierająca potrzebne info, int- liczba wierszy nagłowka
BufferedReader br=new BufferedReader(new FileReader (fileName));//powołujemy nowy obiekt o wyyślonej nazwie br z klasy bufforedReader
if (br.read()!='P' )//! tzn. jeżeli nie bedzie
throw new IOException("Błedny nagłowek");
if (br.read()!='5' )
throw new IOException("Błedny nagłowek");
StreamTokenizer st= new StreamTokenizer(br);
st.commentChar ('#');//informjemy, że znakiem rozpoczynającym komentaRZ jest #
boolean wrong=false;
if (st.nextToken()==StreamTokenizer.TT_NUMBER) xres=(int) st.nval;// wczytuje kolejną całostkę, jezęli te znaki sąliczbą to weź jej wartość numeryczną, zamien na int i podstaw pod x
else wrong=true;
if (wrong) throw IOException();
br.close();
return st.lineno();
}
public void load (String fileName) throws IOException
{
int line=readHeader(fileName);
FileInputStream fis= new FileInputStream (fileName);//czytanie z pliku
int c=0; //licznik linii
while (c<line)
if (fis.read()=='\n')
c++;
pt=new byte [xres*yres];
fis.read(pt);
fis.close(); //zamknięcie strumienia
}
private void writeHeader(String fileName) throws IOException { // metoda zapisywania nagłówka
PrintWriter pw=new PrintWriter(new FileWriter(fileName));// klasa print writer wymaga przy tworzeniu podania obiektu innej klasy
pw.print("P5 # my pgm \n" +xres + " "+ yres+"\n255");//zapisanie nagłowka
pw.close(); //zamknięcie pliku
}
public void save(String fileName) throws IOException
{
writeHeader (fileName);
BufferedOutputStream bos= new BufferedOutputStream (new FileOutputStream (fileName));
bos.write(pt);
bos.close();
}
}