Advertisement
Slapoguzov

LSP_lab2_ver2

Oct 16th, 2014
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.44 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #include <time.h>
  6. //#include "stdafx.h"
  7.  
  8.  
  9. #pragma pack(push, 2)
  10. typedef struct {
  11.     char signature[2];
  12.     int size;
  13.     short emptyField1;
  14.     short emptyField2;
  15.     int data;
  16.     int lengthHead;
  17.     int width;
  18.     int heidth;
  19.     short countColorPlace;
  20.     short bit;
  21.     char methodArch[4];
  22.     int lengthRastrMas;
  23.     int gorisResolution;
  24.     int vertResolution;
  25.     int countColorPic;
  26.     int countMainColor;
  27. } head_bmp;
  28. #pragma pack(pop)
  29.  
  30. char nameFile[] = "1.bmp";
  31.  
  32. int saveImg(char *buf, head_bmp head, int width, int heigth, int comp)
  33. {
  34.     FILE *f;
  35.     f = fopen("1_1_1.bmp", "wb");
  36.  
  37.     fwrite(&head, sizeof(char)*54, 1, f);
  38.     fseek(f, head.data, SEEK_SET);
  39.     fwrite(buf, sizeof(char)* ((3 * width*heigth) + (comp*heigth)), 1, f);
  40.     fclose(f);
  41.  
  42.     return 0;
  43. }
  44.  
  45. char* reflectGorisA(char *buffer, int width, int heigth, int comp)
  46. {
  47.     __asm
  48.     {
  49.      mov EAX, 1h;
  50.     _for1:
  51.      PUSH EAX;
  52.      MOV EAX, width;
  53.      IMUL EAX, 3;
  54.      ADD EAX, comp;
  55.      PUSH EBX;              //сохраняем EBX
  56.      MOV EBX, EAX;         
  57.      POP EDX;          
  58.      POP EAX;
  59.      PUSH EAX;
  60.      PUSH EDX;
  61.      SUB EAX, 1h;
  62.      IMUL EAX, EDX;
  63.      POP EBX;             //Восстанавливаем EBX
  64.      POP EAX;
  65.      ADD EAX, 1h;
  66.  
  67.     }
  68.  
  69.     return buffer;
  70. }
  71. char* reflectGoris(char *buffer, int width, int heigth, int comp)
  72. {
  73.     int i, j, index, w;
  74.     char t;
  75.  
  76.    
  77.     for (i = 1; i <= heigth; i = i + 1)
  78.     {
  79.         index = 3 * (i - 1)*width + (i - 1)*comp;
  80.         w = (int)3 * floor(width / 2);
  81.         for (j = 0; j <= w; j = j + 3)
  82.         {
  83.  
  84.             t = buffer[index + j];
  85.             buffer[index + j] = buffer[3 * i*width - j - 3 + (i - 1)*comp];
  86.             buffer[3 * i*width - j - 3 + (i - 1)*comp] = t;
  87.  
  88.             t = buffer[index + j + 1];
  89.             buffer[index + j + 1] = buffer[3 * i*width - j - 2 + (i - 1)*comp];
  90.             buffer[3 * i*width - j - 2 + (i - 1)*comp] = t;
  91.  
  92.             t = buffer[index + j + 2];
  93.             buffer[index + j + 2] = buffer[3 * i*width - j - 1 + (i - 1)*comp];
  94.             buffer[3 * i*width - j - 1 + (i - 1)*comp] = t;
  95.         }
  96.     }
  97.     return buffer;
  98. }
  99. int main()
  100. {
  101.     clock_t time;
  102.     head_bmp imgHead;
  103.     FILE* f;   
  104.     char *buffer;
  105.     int comp;
  106.  
  107.     time = clock();
  108.     if ((f = fopen("1.bmp", "rb")) == NULL)
  109.     {
  110.         printf("Ошибочка вышла: файла не существует");
  111.         return -1;
  112.     }
  113.  
  114.     fread(&imgHead, sizeof(char)*54, 1, f);
  115.     if (imgHead.signature[0] == 0x42 && imgHead.signature[1] == 0x4d)
  116.     {
  117.  
  118.         if (imgHead.bit == 24)
  119.         {
  120.             comp = (4 - (3 * imgHead.width) % 4);
  121.             buffer = (char*)malloc(sizeof(char)* ((3 * imgHead.width*imgHead.heidth) + (comp*imgHead.heidth)));
  122.  
  123.             fseek(f, imgHead.data, SEEK_SET);
  124.             fread(buffer, sizeof(char)* ((3 * imgHead.width*imgHead.heidth) + (comp*imgHead.heidth)), 1, f);
  125.  
  126.             buffer = reflectGoris(buffer, imgHead.width, imgHead.heidth, comp);
  127.  
  128.             buffer = reflectGorisA(buffer, imgHead.width, imgHead.heidth, comp);
  129.  
  130.             saveImg(buffer, imgHead, imgHead.width, imgHead.heidth, comp);
  131.  
  132.             __asm
  133.             {
  134.                 mov EAX, comp;
  135.                 PUSH EAX;
  136.                 mov EAX, imgHead.heidth;
  137.                 PUSH EAX;
  138.                 mov EAX, imgHead.width;
  139.                 PUSH EAX;
  140.                 mov EAX, buffer;
  141.                 PUSH EAX;
  142.             }
  143.  
  144.  
  145.         }
  146.         else
  147.         {
  148.             printf("Ошибочка вышла: глубина цвета должна быть равна 24");
  149.            
  150.         }
  151.     }
  152.  
  153.     else
  154.     {
  155.         printf("Ошибочка вышла: файл неверного формата");
  156.        
  157.     }
  158.  
  159.     fclose(f);
  160.     time = clock() - time;
  161.  
  162.     fprintf(stderr, "%fc", (double)time / CLOCKS_PER_SEC);
  163.     scanf(&buffer);
  164.  
  165.     return 0;
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement