دوران عکس bitmap با c++

marjan.kh

عضو جدید
سلام بچه ها
من میخوام یه عکس bitmap رو با زبان c++ بدون استفاده از هیچ کتابخونه اضافی 90 درجه خلاف عقربه های ساعت بچرخونم.این کد رو نوشتم ولی همه پیکسل ها رو خاکستری نشون میده.میشه بگید مشکلش چیه؟ مرسی
الگوریتمش اینطوریه که header رو بدون تغییر میخونه و تو فایل جدید مینویسه.فقط جای طول و عرض رو عوض میکنه.بعد هر سطر فایل اصلی رو تو آرایه ای از پیکسل ها میریزه و به صورت ستونی تو فایل جدید مینویسه
#include <iostream>
#include <fstream>
using namespace std;
ifstream fi("flower.bmp",ios::binary);
ofstream fo("rotated2.bmp",ios::out|ios::binary|ios::app);
class pixel{
public:
unsigned char red;
unsigned char green;
unsigned char blue;
public:
void read(){
fi.read((char *)&red,1);
fi.seekg(1,ios::cur);
fi.read((char *)&green,1);
fi.seekg(1,ios::cur);
fi.read((char *)&blue,1);
fi.seekg(1,ios::cur);
}
};
class arrayOfPixel{
public:
pixel pix[686];
public:
arrayOfPixel(){
for(int j=0;j<686;j++){
pix[j].read();
}
}
};
class header{
public:
char signature[2];
char fileSize[4];
char reserved[4];
char dataOffset[4];
public:
header(){
fi.seekg (0, ios::beg);
fi.read(signature,2);
fi.seekg (2, ios::cur);
fi.read(fileSize,4);
fi.seekg (4, ios::cur);
fi.read(reserved,4);
fi.seekg (4, ios::cur);
fi.read(dataOffset,4);
fi.seekg (4, ios::cur);
}
};
class infoHeader{
public:
char size[4];
char width[4];
char temp[4];
char height[4];
char planes[2];
char bitCount[2];
char compression[4];
char imageSize[4];
char xPixelPerM[4];
char yPixelPerM[4];
char colorsUsed[4];
char colorsImportant[4];
public:
infoHeader(){
fi.read(size,4);
fi.seekg (4, ios::cur);
fi.read(width,4);
fi.seekg (4, ios::cur);
fi.read(height,4);
fi.seekg (4, ios::cur);
fi.read(planes,2);
fi.seekg (2, ios::cur);
fi.read(bitCount,2);
fi.seekg (2, ios::cur);
fi.read(compression,4);
fi.seekg (4, ios::cur);
fi.read(imageSize,4);
fi.seekg (4, ios::cur);
fi.read(xPixelPerM,4);
fi.seekg (4, ios::cur);
fi.read(yPixelPerM,4);
fi.seekg (4, ios::cur);
fi.read(colorsUsed,4);
fi.seekg (4, ios::cur);
fi.read(colorsImportant,4);
fi.seekg (4, ios::cur);
}
};
int main(){
if(!fo.is_open())
cout<<"error";
header h;
infoHeader infoH;
fo.seekp(0,ios::beg);
fo.write(h.signature,2);
fo.write(h.fileSize,4);
fo.write(h.reserved,4);
fo.write(h.dataOffset,4);
fo.write(infoH.size,4);
fo.write(infoH.height,4);
fo.write(infoH.width,4);
fo.write(infoH.planes,2);
fo.write(infoH.bitCount,2);
fo.write(infoH.compression,4);
fo.write(infoH.imageSize,4);
fo.write(infoH.xPixelPerM,4);
fo.write(infoH.yPixelPerM,4);
fo.write(infoH.colorsUsed,4);
fo.write(infoH.colorsImportant,4);
for(int i=0;i<800;i++){
arrayOfPixel a;
for(int j=686;j>0;j--){
fo.write((char *)&a.pix[j].red,1);
fo.write((char *)&a.pix[j].green,1);
fo.write((char *)&a.pix[j].blue,1);
fo.seekp(799*3,ios::cur);
//fo.seekp()
}
}
fi.close();
fo.close();
return 0;
}
 

Similar threads

بالا