//************************************************************* typedef struct _HICOLOR { union { // цельный цвет DWORD Color; // составляющие struct { BYTE B; BYTE G; BYTE R; BYTE Alpha; } Layer; }; } HICOLOR, *PHICOLOR, *LPHICOLOR; //************************************************************* //* //* Старт программы //* //************************************************************* int main(int Count, char ** pArguments) { //**** HANDLE hFile; BITMAPFILEHEADER FileHeader; BITMAPINFOHEADER InfoHeader; LPBYTE pFileData; LPHICOLOR pImageData; DWORD Size; DWORD LineSize; DWORD FileOffset; DWORD ImageOffset; DWORD x; DWORD y; // открываем файл hFile = CreateFile(*(pArguments+1),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL); // читаем заголовок файла ReadFile(hFile,(LPVOID)&FileHeader,sizeof(BITMAPFILEHEADER),&Size,NULL); // читаем заголовок изображения ReadFile(hFile,(LPVOID)&InfoHeader,sizeof(BITMAPINFOHEADER),&Size,NULL); // если это изображение R8G8B8 if( InfoHeader.biBitCount == 24 ) { // выделяем память под данные файла изображения pFileData = (LPBYTE)GlobalAlloc(GPTR,InfoHeader.biSizeImage); // читаем данные файла изображения SetFilePointer(hFile,FileHeader.bfOffBits,NULL,FILE_BEGIN); ReadFile(hFile,(LPVOID)pFileData,InfoHeader.biSizeImage,&Size,NULL); // закрываем файл CloseHandle(hFile); // вычисляем размер линии по горизонтали, так как она должна быть выравнена на DWORD // это нужно для дальнейших преобразований LineSize = InfoHeader.biSizeImage / InfoHeader.biHeight; // выделяем память под рабочие данные изображения pImageData = (LPHICOLOR)GlobalAlloc(GPTR,InfoHeader.biWidth*InfoHeader.biHeight*sizeof(HICOLOR)); // формируем рабочее изображение for( y=0; yLayer.Alpha = 0xFF; (pImageData+ImageOffset)->Layer.B = *(pFileData+FileOffset); (pImageData+ImageOffset)->Layer.G = *(pFileData+FileOffset+1); (pImageData+ImageOffset)->Layer.R = *(pFileData+FileOffset+2); } } // освобождаем ранее выделенную память под данные файла изображения GlobalFree(pFileData); // Изменяем размер Resize(&pImageData,(LPDWORD)&InfoHeader.biWidth,(LPDWORD)&InfoHeader.biHeight,InfoHeader.biWidth/2,InfoHeader.biHeight/2); // Обрезаем Cut(&pImageData,(LPDWORD)&InfoHeader.biWidth,(LPDWORD)&InfoHeader.biHeight,InfoHeader.biWidth/4,InfoHeader.biHeight/4,InfoHeader.biWidth*3/4,InfoHeader.biHeight*3/4); // Добавляем шум AppendNoise(pImageData,InfoHeader.biWidth,InfoHeader.biHeight); // вычисляем размер линии по горизонтали, так как она должна быть выравнена на DWORD // это нужно для дальнейших преобразований for( LineSize=InfoHeader.biWidth*3; (LineSize & 0x00000003); LineSize++ ); // заполняем описание нового изображения InfoHeader.biSizeImage = LineSize * InfoHeader.biHeight; FileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + InfoHeader.biSizeImage; // выделяем память под данные файла изображения pFileData = (LPBYTE)GlobalAlloc(GPTR,InfoHeader.biSizeImage); // формируем готовое изображение for( y=0; yLayer.B; *(pFileData+FileOffset+1) = (pImageData+ImageOffset)->Layer.G; *(pFileData+FileOffset+2) = (pImageData+ImageOffset)->Layer.R; } } // освобождаем ранее выделенную память под рабочие данные изображения GlobalFree(pImageData); // создаем файл hFile = CreateFile(*(pArguments+2),GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,NULL); // записываем заголовок файла WriteFile(hFile,(LPVOID)&FileHeader,sizeof(BITMAPFILEHEADER),&Size,NULL); // записываем заголовок изображения WriteFile(hFile,(LPVOID)&InfoHeader,sizeof(BITMAPINFOHEADER),&Size,NULL); // записываем само изображение WriteFile(hFile,(LPVOID)pFileData,InfoHeader.biSizeImage,&Size,NULL); // закрываем файл CloseHandle(hFile); // освобождаем ранее выделенную память под данные файла изображения GlobalFree(pFileData); } // закрываем файл else CloseHandle(hFile); return 0; }