N
Hm.. Danke für den Link, allerdings will ich eigentlich meinen Code selbst "erfinden"
Ich bin schon recht weit mit meiner Klasse, nur bin ich auf Probleme gestoßen:
1. Wenn ich ein pic als 24bmp exportiere, sieht das mit MSPaint aus, wie es aussehen sollte, und mit der XP-Standardanzeige sind Blau und Grün vertauscht...
2. Wenn ich jedem Pixel einzeln seinen Wert zuweise bekomme ich ein seltsames Muster, wenn ich das per Konstruktor mache (siehe Code) ist alles einfarbig, wie es sein sollte...
Hier der Code:
#ifndef PIC_H_INCLUDED
#define PIC_H_INCLUDED
struct Pixel {
char R;
char G;
char B;
};
class Picture {
Pixel *pix;
long x;
long y;
public:
Picture() { pix = 0; x = 0; y = 0; }
Picture(long a,long b) { pix = new Pixel[a*b]; x = a; y = b; }
Picture(long,long, char,char,char); //Um diesen Konstruktor geht's
~Picture() { delete [] pix; }
void setdimension(long, long);
void setwidth(long);
void setheight(long);
long getwidht();
long getheight();
void setPixel(long,long, char,char,char); //Und hiermit: seltsames Muster (siehe main.cpp)
Pixel getPixel(long,long);
char getR(long,long);
char getG(long,long);
char getB(long,long);
void line(long,long, long,long);
void to24Bmp(char*);
};
#endif
#include <iostream>
#include <fstream>
#include <cstdlib>
#include "pic.h"
using namespace std;
template <class T>
void writeBin(fstream &Out, T data)
{
Out.write(reinterpret_cast<char*> (&data), sizeof(T));
}
Picture::Picture(long a,long b, char R,char G,char B)
{
if(a < 0 || b < 0 || a > 10000 || b > 10000)
{
cout << "error: dimensions are too big / below zero";
exit(-1);
}
unsigned register long i;
pix = new Pixel[a*b];
x = a;
y = b;
for(i = 0; i < a*b; ++i)
{
pix[i].R = R;
pix[i].G = G;
pix[i].B = B;
}
}
void Picture::setPixel(long a,long b, char R,char G,char B)
{
pix[a*b].R = R;
pix[a*b].G = G;
pix[a*b].B = B;
}
Pixel Picture::getPixel(long a,long b)
{
return pix[a*b];
}
char Picture::getR(long x,long y)
{
return pix[x*y].R;
}
char Picture::getG(long x,long y)
{
return pix[x*y].G;
}
char Picture::getB(long x,long y)
{
return pix[x*y].B;
}
void Picture::to24Bmp(char *filename)
{
unsigned register long i;
fstream data(filename, ios::out | ios::binary | ios::trunc);
if(!data.is_open() || data.bad())
{
cout << "error: cannot open file" << endl;
exit(-1);
}
writeBin(data, 'B');
writeBin(data, 'M');
writeBin(data, (long) x*y*3+52);
writeBin(data, (long) 0);
writeBin(data, (long) 52);
writeBin(data, (long) 40);
writeBin(data, x);
writeBin(data, y);
writeBin(data, (short) 1);
writeBin(data, (short) 24);
writeBin(data, (long) 0);
writeBin(data, (long) 0);
writeBin(data, (long) 0);
writeBin(data, (long) 0);
writeBin(data, (long) 0);
writeBin(data, (long) 0);
for(i = 0; i < x*y; ++i)
{
writeBin(data, pix[i]);
}
}
#include <iostream>
#include "pic.h"
using namespace std;
int main()
{
unsigned register long i;
Picture p(100,100);
for(i = 0; i < 10000; ++i)
{
p.set(i%100, i/100, 0,255,0); // ???
}
p.to24Bmp("D:\\Eigene~1\\f.bmp");
return 0;
}
Danke für die Hilfe! Und sorry, dass ich jetzt den kompletten Code reingepostet hab...