035
28.08.2006, 19:45 Uhr
Yadgar
|
High!
Zitat von ao: |
[quote Yadgar]Bei mir leider nicht...
|
Bitte Source zeigen, das ganze Programm, so wie letztens. Ich hab schon nen Verdacht. [/quote]
Bittesehr... um nicht noch mehr Fehler reinzubasteln, habe ich es erst mal nicht modularisiert!
C++: |
// YIP - Yadgar's Image Processor
#include <iostream> #include <fstream> using namespace std;
#define TEST // #undef TEST
bool weiter(void);
class Pixel { friend class Image; private: unsigned char b; // da Farbwerte bei normaler 24bit-Grafik nur unsigned char g; // zwischen 0 und 255 liegen können, unsigned char r; // genügt hier ein 1 Byte langer Typ // Private Methoden zur Angabe von Farbwerten, wegen ihrer Kürze inline unsigned char blue(void) { return b; } unsigned char green(void) { return g; } unsigned char red(void) { return r; } // Private Methoden zum Setzen von Farbwerten, ebenfalls inline void setBlue(unsigned char b) { this->b=b; } void setGreen(unsigned char g) { this->g=g; } void setRed(unsigned char r) { this->r=r; } /* public: Pixel (unsigned char, unsigned char, unsigned char); // Konstruktor */ };
/* Pixel::Pixel (unsigned char bl, unsigned char gr, unsigned char rd) { b=bl; g=gr; r=rd; } */
class Image { private: unsigned short width; unsigned short height; Pixel* matrix; public: Image (unsigned short, unsigned short); // Konstruktor ~Image(); // Destruktor unsigned long cCount (unsigned char, unsigned char, unsigned char); // zählt Pixel der angegegebenen Farbe, wichtig: Farbwert- // reihenfolge ist Standard, also r, g, b! unsigned long notBlack (void); // zählt nicht-schwarze Pixel (Methode nur provisorisch!) unsigned short getWidth() { return width; } unsigned short getHeight() { return height; } void setPixel(unsigned short, unsigned short, unsigned char, unsigned char, unsigned char); void pDisplay(void); // zeigt einzelne Pixel an };
Image::Image (unsigned short w, unsigned short h) { matrix = new Pixel[h*w]; width=w; height=h; }
Image::~Image() { delete[] matrix; }
unsigned long Image::cCount (unsigned char r, unsigned char g, unsigned char b) { unsigned long n=0; unsigned long x; unsigned long y; for (y=0; y<height; y++) { for (x=0; x<width; x++) { if ( (matrix[y*width+x].blue()==b) && (matrix[y*width+x].green()==g) && (matrix[y*width+x].red()==r) ) n++; // cout << (int)matrix[y*width+x].red() << ", " << (int)matrix[y*width+x].green() << ", " << (int)matrix[y*width+x].blue() << endl; } } return n; }
unsigned long Image::notBlack (void) { unsigned long n=0; unsigned long x; unsigned long y; for (y=0; y<height; y++) { for (x=0; x<width; x++) { if ( (matrix[y*width+x].blue()) || (matrix[y*width+x].green()) || (matrix[y*width+x].red()) ) n++; } } return n; }
void Image::pDisplay(void) { unsigned long x; unsigned long y; unsigned long pn; bool flag=weiter(); if (flag) { for (y=0; y<height; y++) { for (x=0; x<width; x++) { pn = y*width+x; cout << pn << "\t\t\t" << (int)matrix[y*width+x].red() << ", " << (int)matrix[y*width+x].green() << ", " << (int)matrix[y*width+x].blue() << endl; if (pn>0 && !(pn%20)) flag=weiter(); if (!flag) goto ex; } } } ex: ; }
void Image::setPixel(unsigned short x, unsigned short y, unsigned char b, unsigned char g, unsigned char r) { matrix[y*width+x].setBlue(b); matrix[y*width+x].setGreen(g); matrix[y*width+x].setRed(r); } bool weiter(void) { char antwort; do { cout << "Ausgabe fortsetzen? "; cin >> antwort; if (antwort != 'j' && antwort != 'n') cout << "Bitte nur j oder n eingeben!" << endl; } while (antwort != 'j' && antwort != 'n'); if (antwort == 'j') return true; else return false; }
int main() { string name; ifstream input; char ch; unsigned char r, g, b; unsigned char p_bit; // Größe eines Pixels in Bit, ausgelesen in Byte 16 der TGA-Datei unsigned char p_byte; // Größe eines Pixels in Byte (p_bit/8) long int i=0, n=0, pn=0; #ifdef TEST long int p=0; // zählt testhalber die nicht-schwarzen Pixel schon beim Einlesen #endif unsigned short int xsize, ysize, x=0, y=0, rd, gr, bl; bool flag;
/* do { */ cout << "Bitte geben Sie den Namen der zu ladenden Grafikdatei ein: "; cin >> name; input.open(name.c_str(), ios_base::in | ios_base::binary); while (input.get(ch) && i<18) { switch(i) { case 12: xsize=(unsigned char)ch; break; case 13: xsize+=(unsigned char)ch*256; break; case 14: ysize=(unsigned char)ch; break; case 15: ysize+=(unsigned char)ch*256; break; case 16: p_bit=(unsigned char)ch; break; } i++; } p_byte=p_bit/8; Image picture(xsize, ysize); cout << "\nDas Bild ist " << picture.getWidth() << " Pixel breit und " << picture.getHeight() << " Pixel hoch." << endl; cout << "i = " << i << endl << endl; flag=weiter(); input.close(); input.open(name.c_str()); i=0; while (input.get(ch) && p < xsize*ysize ) { if (i >= 18) { n=i-18; pn = xsize*y+x; // Nummer des aktuellen Pixels if (n>0 && !(n%p_byte)) x++; if (n>0 && !(n%(xsize*p_byte))) { x=0; y++; } switch(n%p_byte) { case 0: b=ch; break; case 1: g=ch; break; case 2: r=ch; picture.setPixel(x, y, b, g, r); #ifdef TEST p++; if (flag && pn<=xsize*ysize && p>=356000) { cout << pn << "\t\t\t<" << (unsigned short)r <<", " << (unsigned short)g << ", " << (unsigned short)b << ">\n"; if (pn>0 && !(pn%20)) flag=weiter(); } #endif break; case 3: ; // vorerst leer, wird bei späterer Implementierung einer Klasse für 32bit-Pixel // berücksichtigt! break; } } // if (!i) cout << "Beginn des Datenteils!" << endl; i++; } #ifdef TEST cout << pn << " Pixel eingelesen!" << endl; cout << "Daten im Objekt \"Image\": " << endl; picture.pDisplay(); #endif /* cout << "\nNach welcher Farbe soll gesucht werden? " << endl; cout << "Rotwert: "; cin >> rd; cout << "Gr" << (char)129 << "nwert: "; cin >> gr; cout << "Blauwert: "; cin >> bl; */ cout << "Die Datei enth" << (char)132 << "lt " << picture.notBlack() << " gesetzte Pixel" << endl; /* flag=weiter(); input.close(); } while(flag); */
/* r=(unsigned char)rd; g=(unsigned char)gr; b=(unsigned char)bl; cout << "Die von ihnen gesuchte Farbe kommt im Bild " << picture.cCount(r, g, b) << " mal vor." << endl;*/
system("pause"); }
|
Zitat: |
Ächz ... und was ist mit uns?!?
|
Vielleicht sind wir als Menschen mit unseren Steinzeitgenen ja allesamt nicht wirklich dazu geschaffen, viele Stunden am Tag regungslos vor Bildschirmen zu sitzen und über Problemen zu brüten, die wir ohne Computer gar nicht hätten... vielleicht wäre es wirklich besser für uns, wenn wir stattdessen mit Jagdspeeren hinter Mammuts herrennen oder zumindest Schafe auf Hindukusch-Almen hüten wurden...
...nur mal so eine Idee zur Meta-Diskussion über Sinn und Unsinn von IT!
Bis bald im Khyberspace!
Yadgar -- Flagmaker - ein Programmier-Blog |