Advertisement
Deerenaros

Working with BMP. For education by 'Yos'.

Jul 4th, 2012
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.02 KB | None | 0 0
  1. //*************************************************************
  2.  
  3. typedef struct _HICOLOR
  4. {
  5.     union
  6.     {
  7.         // цельный цвет
  8.         DWORD   Color;
  9.  
  10.         // составляющие
  11.         struct
  12.         {
  13.             BYTE    B;
  14.             BYTE    G;
  15.             BYTE    R;
  16.             BYTE    Alpha;
  17.  
  18.         } Layer;
  19.     };
  20.  
  21. } HICOLOR, *PHICOLOR, *LPHICOLOR;
  22.  
  23. //*************************************************************
  24. //*
  25. //* Старт программы
  26. //*
  27. //*************************************************************
  28. int main(int Count, char ** pArguments)
  29. {
  30.  //****
  31.  HANDLE                 hFile;
  32.  
  33.  BITMAPFILEHEADER       FileHeader;
  34.  BITMAPINFOHEADER       InfoHeader;
  35.  
  36.  LPBYTE                 pFileData;
  37.  LPHICOLOR              pImageData;
  38.  
  39.  DWORD                  Size;
  40.  DWORD                  LineSize;
  41.  
  42.  DWORD                  FileOffset;
  43.  DWORD                  ImageOffset;
  44.  
  45.  DWORD                  x;
  46.  DWORD                  y;
  47.  
  48.  // открываем файл
  49.  hFile = CreateFile(*(pArguments+1),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
  50.  // читаем заголовок файла
  51.  ReadFile(hFile,(LPVOID)&FileHeader,sizeof(BITMAPFILEHEADER),&Size,NULL);
  52.  // читаем заголовок изображения
  53.  ReadFile(hFile,(LPVOID)&InfoHeader,sizeof(BITMAPINFOHEADER),&Size,NULL);
  54.  
  55.  // если это изображение R8G8B8
  56.  if( InfoHeader.biBitCount == 24 )
  57.  {
  58.     // выделяем память под данные файла изображения
  59.     pFileData = (LPBYTE)GlobalAlloc(GPTR,InfoHeader.biSizeImage);
  60.  
  61.     // читаем данные файла изображения
  62.     SetFilePointer(hFile,FileHeader.bfOffBits,NULL,FILE_BEGIN);
  63.     ReadFile(hFile,(LPVOID)pFileData,InfoHeader.biSizeImage,&Size,NULL);
  64.  
  65.     // закрываем файл
  66.     CloseHandle(hFile);
  67.  
  68.     // вычисляем размер линии по горизонтали, так как она должна быть выравнена на DWORD
  69.     // это нужно для дальнейших преобразований
  70.     LineSize = InfoHeader.biSizeImage / InfoHeader.biHeight;
  71.  
  72.     // выделяем память под рабочие данные изображения
  73.     pImageData = (LPHICOLOR)GlobalAlloc(GPTR,InfoHeader.biWidth*InfoHeader.biHeight*sizeof(HICOLOR));
  74.  
  75.     // формируем рабочее изображение
  76.     for( y=0; y<InfoHeader.biHeight; y++ )
  77.     {
  78.         for( x=0; x<InfoHeader.biWidth; x++ )
  79.         {
  80.             // расчитываем смещения
  81.             FileOffset = y * LineSize + x * 3;
  82.             ImageOffset = y * InfoHeader.biWidth + x;
  83.  
  84.             // формируем рабочие данные
  85.             (pImageData+ImageOffset)->Layer.Alpha = 0xFF;
  86.             (pImageData+ImageOffset)->Layer.B = *(pFileData+FileOffset);
  87.             (pImageData+ImageOffset)->Layer.G = *(pFileData+FileOffset+1);
  88.             (pImageData+ImageOffset)->Layer.R = *(pFileData+FileOffset+2);
  89.         }
  90.     }
  91.  
  92.     // освобождаем ранее выделенную память под данные файла изображения
  93.     GlobalFree(pFileData);
  94.  
  95.     // Изменяем размер
  96.     Resize(&pImageData,(LPDWORD)&InfoHeader.biWidth,(LPDWORD)&InfoHeader.biHeight,InfoHeader.biWidth/2,InfoHeader.biHeight/2);
  97.  
  98.     // Обрезаем
  99.     Cut(&pImageData,(LPDWORD)&InfoHeader.biWidth,(LPDWORD)&InfoHeader.biHeight,InfoHeader.biWidth/4,InfoHeader.biHeight/4,InfoHeader.biWidth*3/4,InfoHeader.biHeight*3/4);
  100.  
  101.     // Добавляем шум
  102.     AppendNoise(pImageData,InfoHeader.biWidth,InfoHeader.biHeight);
  103.  
  104.     // вычисляем размер линии по горизонтали, так как она должна быть выравнена на DWORD
  105.     // это нужно для дальнейших преобразований
  106.     for( LineSize=InfoHeader.biWidth*3; (LineSize & 0x00000003); LineSize++ );
  107.  
  108.     // заполняем описание нового изображения
  109.     InfoHeader.biSizeImage = LineSize * InfoHeader.biHeight;
  110.     FileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + InfoHeader.biSizeImage;
  111.  
  112.     // выделяем память под данные файла изображения
  113.     pFileData = (LPBYTE)GlobalAlloc(GPTR,InfoHeader.biSizeImage);
  114.  
  115.     // формируем готовое изображение
  116.     for( y=0; y<InfoHeader.biHeight; y++ )
  117.     {
  118.         for( x=0; x<InfoHeader.biWidth; x++ )
  119.         {
  120.             // расчитываем смещения
  121.             FileOffset = y * LineSize + x * 3;
  122.             ImageOffset = y * InfoHeader.biWidth + x;
  123.  
  124.             // формируем рабочие данные
  125.             *(pFileData+FileOffset) = (pImageData+ImageOffset)->Layer.B;
  126.             *(pFileData+FileOffset+1) = (pImageData+ImageOffset)->Layer.G;
  127.             *(pFileData+FileOffset+2) = (pImageData+ImageOffset)->Layer.R;
  128.         }
  129.     }
  130.  
  131.     // освобождаем ранее выделенную память под рабочие данные изображения
  132.     GlobalFree(pImageData);
  133.  
  134.     // создаем файл
  135.     hFile = CreateFile(*(pArguments+2),GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,NULL);
  136.     // записываем заголовок файла
  137.     WriteFile(hFile,(LPVOID)&FileHeader,sizeof(BITMAPFILEHEADER),&Size,NULL);
  138.     // записываем заголовок изображения
  139.     WriteFile(hFile,(LPVOID)&InfoHeader,sizeof(BITMAPINFOHEADER),&Size,NULL);
  140.     // записываем само изображение
  141.     WriteFile(hFile,(LPVOID)pFileData,InfoHeader.biSizeImage,&Size,NULL);
  142.  
  143.     // закрываем файл
  144.     CloseHandle(hFile);
  145.  
  146.     // освобождаем ранее выделенную память под данные файла изображения
  147.     GlobalFree(pFileData);
  148.  }
  149.  
  150.  // закрываем файл
  151.  else CloseHandle(hFile);
  152.  
  153.  return 0;
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement