Класс CWorkBin предназначен для работы с файлом, в котором находиться массив яркостей, т.е. яркость от 0 до 255.
Этот класс позволяет загрузить массив в ОП и привести действия поворот в право и на лево 90 градусов ,поворот 180 и
отображение по вертикали и горизонтали. А так же преобразование его в файл BMP.
Я буду описывать функции, а в конце приведу полный текст класса.
Для чтения массива яркостей используется функция
----- WorkBin.h -----
byte* LoadFromFile(CString strFileName);
----- WorkBin.h -----
----- WorkBin.cpp -----
byte* CWorkBin::LoadFromFile(CString strFileName)
{
byte* buf1;
buf1 = NULL;
CFile InFile(strFileName,CFile::modeRead|CFile::typeBinary);
l_FileSize = (UINT)InFile.GetLength();
Height = int(l_FileSize/Width);
buf1 = (byte*)malloc(l_FileSize);
if (!buf1)
{
InFile.Close();
return NULL;
}
InFile.Read(buf1,l_FileSize);
InFile.Close();
return buf1;
}
----- WorkBin.cpp -----
Возвращает адрес на массив и заполняет локальные переменные
----- WorkBin.h -----
private:
// Длина файла массива яркостей
UINT l_FileSize;
// Ширина массива
int Width;
// Высота массива
int Height;
----- WorkBin.h -----
Для сохранения массива яркостей используется функция
----- WorkBin.h -----
// Сохранения массива яркостей в бинарный файл
int SaveToFile(byte* buf,CString strFileName);
----- WorkBin.h -----
----- WorkBin.cpp -----
int CWorkBin::SaveToFile(byte* buf,CString strFileName)
{
CStringA strTemp;
FILE *fHandle;
strTemp = strFileName;
if (l_FileSize != 0)
{
fopen_s(&fHandle,strTemp,"wb");
fwrite(buf,l_FileSize,1,fHandle);
fclose(fHandle);
return 0;
}
else
return -1;
}
----- WorkBin.cpp -----
Поворот в право и на лево 90 градусов ,поворот 180 объедены в одну функцию, а тип поворота задается параметром, который должен иметь значения из объединения
----- WorkBin.h -----
public:
enum {
R_Right90 = (int) 0x00000, // Поворот вправо 90
R_Left90 = (int) 0x00001, // Поворот влево 90
R_Angle180 = (int) 0x00002, // Поворот на 180
};
// Повороты массива яркостей на углы -90, +90, +180
int RotateBin(byte* buf,int Width,int Height,int Pref,UINT TypeRoute);
int RotateBin(byte* buf,int Width,int Height,UINT TypeRoute);
----- WorkBin.h -----
----- WorkBin.cpp -----
int CWorkBin::RotateBin(byte* buf,int Width,int Height,int Pref,UINT TypeRoute)
{
byte* buf1;
UINT m_Len;
int x,y,ind1,ind2;
m_Len = Width*Height;
// Проверка
if (m_Len == 0
{
return -1;
}
buf1 = (byte*)malloc(m_Len);
if (!buf1)
{
return -1;
}
// Копировать массив яркостей
::memcpy(buf1,buf,m_Len);)
switch (TypeRoute)
{
case R_Right90:
for (y = 0; y < Height; y++)
for (x = 0; x < Width; x++)
{
ind1 = Pref+x*Height+((Height-1)-y);
ind2 = y*Width+x;
buf[ind1] = buf1[ind2];
}
this->Width = Height;
this->Height = Width;
break;
case R_Left90:
for (y = 0; y < Height; y++)
for (x = 0; x < Width; x++)
{
ind1 = Pref+((Width-1)-x)*Height+y;
ind2 = y*Width+x;
buf[ind1] = buf1[ind2];
}
this->Width = Height;
this->Height = Width;
break;
case R_Angle180:
for (y = 0; y < Height; y++)
for (x = 0; x < Width; x++)
{
ind1 = Pref+((Width-1)-x)+((Height-1)-y)*Width;
ind2 = y*Width+x;
buf[ind2] = buf1[ind1];
}
break;
default:
break;
}
delete buf1;
return 0;
}
int CWorkBin::RotateBin(byte* buf,int Width,int Height,UINT TypeRoute)
{
return RotateBin(buf,Width,Height,0,TypeRoute);
}
----- WorkBin.cpp -----
Продожение следует....