Advertisement
Slapoguzov

LSP_lab2_ver3

Oct 16th, 2014
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.70 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.     int i, j, index, w;
  48.     char t;
  49.  
  50.     __asm
  51.     {
  52.         //for (i = 1; i <= heigth; i = i + 1)
  53.         mov i, 1;
  54.         jmp LN6;
  55.         LN5:
  56.         mov eax, i;
  57.         add eax, 1;
  58.         mov i, eax;
  59.         LN6:
  60.         mov eax, i;
  61.         cmp eax, heigth;
  62.         jg  LN4;   
  63.         //index = 3 * (i - 1)*width + (i - 1)*comp;
  64.         mov eax, i;
  65.         sub eax, 1;
  66.         imul ecx, eax, 3;
  67.         imul    ecx, width;
  68.         mov edx, i;
  69.         sub edx, 1;
  70.         imul    edx, comp;
  71.         add ecx, edx;
  72.         mov index, ecx;
  73.         //w = (int)3 * floor(width / 2);
  74.         mov eax, width;
  75.         shr eax, 1;
  76.         imul eax, 3;
  77.         mov w, eax;
  78.         //for (j = 0; j <= w; j = j + 3)
  79.         mov j, 0;
  80.         jmp LN3;
  81.         LN2:
  82.         mov eax, j;
  83.         add eax, 3
  84.         mov j, eax;
  85.         LN3:
  86.         mov eax, j;
  87.         cmp eax, w;
  88.         jg  LN1;
  89.         //t = buffer[index + j];
  90.         mov eax, index;
  91.         add eax, j;
  92.         mov esi, buffer;
  93.         add esi, eax;
  94.         lodsb;
  95.         mov t, al;
  96.         //buffer[index + j] = buffer[3 * i*width - j - 3 + (i - 1)*comp];
  97.         imul    eax, i, 3;
  98.         imul    eax, width;
  99.         sub eax, j;
  100.         mov ecx, i;
  101.         sub ecx, 1;
  102.         imul    ecx, comp;
  103.         lea esi, [eax + ecx - 3];
  104.         mov edi, index;
  105.         add edi, j;
  106.         mov ecx, buffer;
  107.         add esi, ecx;
  108.         add edi, ecx;
  109.         lodsb;
  110.         stos;
  111.         //buffer[3 * i*width - j - 3 + (i - 1)*comp] = t;
  112.         imul    eax, i, 3;
  113.         imul    eax, width;
  114.         sub eax, j;
  115.         mov ecx, i;
  116.         sub ecx, 1;
  117.         imul    ecx, comp;
  118.         mov edi, ecx;
  119.         add edi, eax;
  120.         sub edi, 3;
  121.         add edi, buffer;
  122.         mov al, t;
  123.         stos;
  124.         //t = buffer[index + j + 1];
  125.         mov eax, index;
  126.         add eax, j;
  127.         mov esi, buffer;
  128.         add esi, eax;
  129.         add esi, 1;
  130.         lodsb;
  131.         mov t, al;;
  132.         //buffer[index + j + 1] = buffer[3 * i*width - j - 2 + (i - 1)*comp];
  133.         imul    eax, i, 3;
  134.         imul    eax, width;
  135.         sub eax, j;
  136.         mov ecx, i;
  137.         sub ecx, 1;
  138.         imul    ecx, comp;
  139.         lea esi, [eax + ecx - 2];
  140.         mov edi, index;
  141.         add edi, j;
  142.         add edi, 1;
  143.         mov ecx, buffer;
  144.         add esi, ecx;
  145.         add edi, ecx;
  146.         lodsb;
  147.         stos;
  148.         //buffer[3 * i*width - j - 2 + (i - 1)*comp] = t;
  149.         imul    eax, i, 3;
  150.         imul    eax, width;
  151.         sub eax, j;
  152.         mov ecx, i;
  153.         sub ecx, 1;
  154.         imul    ecx, comp;
  155.         mov edi, ecx;
  156.         add edi, eax;
  157.         sub edi, 2;
  158.         add edi, buffer;
  159.         mov al, t;
  160.         stos;
  161.         //t = buffer[index + j + 2];
  162.         mov eax, index;
  163.         add eax, j;
  164.         mov esi, buffer;
  165.         add esi, eax;
  166.         add esi, 2;
  167.         lodsb;
  168.         mov t, al;;
  169.         //buffer[index + j + 2] = buffer[3 * i*width - j - 1 + (i - 1)*comp];
  170.         imul    eax, i, 3;
  171.         imul    eax, width;
  172.         sub eax, j;
  173.         mov ecx, i;
  174.         sub ecx, 1;
  175.         imul    ecx, comp;
  176.         lea esi, [eax + ecx - 1];
  177.         mov edi, index;
  178.         add edi, j;
  179.         add edi, 2;
  180.         mov ecx, buffer;
  181.         add esi, ecx;
  182.         add edi, ecx;
  183.         lodsb;
  184.         stos;
  185.         //buffer[3 * i*width - j - 1 + (i - 1)*comp] = t;
  186.         imul    eax, i, 3;
  187.         imul    eax, width;
  188.         sub eax, j;
  189.         mov ecx, i;
  190.         sub ecx, 1;
  191.         imul    ecx, comp;
  192.         mov edi, ecx;
  193.         add edi, eax;
  194.         sub edi, 1;
  195.         add edi, buffer;
  196.         mov al, t;
  197.         stos;
  198.         jmp LN2;
  199.         LN1:
  200.         jmp LN5;
  201.         LN4:
  202.     }
  203.  
  204.     return buffer;
  205. }
  206. char* reflectGoris(char *buffer, int width, int heigth, int comp)
  207. {
  208.     int i, j, index, w;
  209.     char t;
  210.  
  211.    
  212.     for (i = 1; i <= heigth; i = i + 1)
  213.     {
  214.         index = 3 * (i - 1)*width + (i - 1)*comp;
  215.         w = (int)3 * floor(width / 2);
  216.         for (j = 0; j <= w; j = j + 3)
  217.         {
  218.  
  219.             t = buffer[index + j];
  220.             buffer[index + j] = buffer[3 * i*width - j - 3 + (i - 1)*comp];
  221.             buffer[3 * i*width - j - 3 + (i - 1)*comp] = t;
  222.  
  223.             t = buffer[index + j + 1];
  224.             buffer[index + j + 1] = buffer[3 * i*width - j - 2 + (i - 1)*comp];
  225.             buffer[3 * i*width - j - 2 + (i - 1)*comp] = t;
  226.  
  227.             t = buffer[index + j + 2];
  228.             buffer[index + j + 2] = buffer[3 * i*width - j - 1 + (i - 1)*comp];
  229.             buffer[3 * i*width - j - 1 + (i - 1)*comp] = t;
  230.         }
  231.     }
  232.     return buffer;
  233. }
  234. int main()
  235. {
  236.     clock_t time;
  237.     head_bmp imgHead;
  238.     FILE* f;   
  239.     char *buffer;
  240.     int comp;
  241.  
  242.     time = clock();
  243.     if ((f = fopen("1.bmp", "rb")) == NULL)
  244.     {
  245.         printf("Ошибочка вышла: файла не существует");
  246.         return -1;
  247.     }
  248.  
  249.     fread(&imgHead, sizeof(char)*54, 1, f);
  250.     if (imgHead.signature[0] == 0x42 && imgHead.signature[1] == 0x4d)
  251.     {
  252.  
  253.         if (imgHead.bit == 24)
  254.         {
  255.             comp = (4 - (3 * imgHead.width) % 4);
  256.             buffer = (char*)malloc(sizeof(char)* ((3 * imgHead.width*imgHead.heidth) + (comp*imgHead.heidth)));
  257.  
  258.             fseek(f, imgHead.data, SEEK_SET);
  259.             fread(buffer, sizeof(char)* ((3 * imgHead.width*imgHead.heidth) + (comp*imgHead.heidth)), 1, f);
  260.  
  261.             //buffer = reflectGoris(buffer, imgHead.width, imgHead.heidth, comp);
  262.  
  263.             buffer = reflectGorisA(buffer, imgHead.width, imgHead.heidth, comp);
  264.  
  265.             saveImg(buffer, imgHead, imgHead.width, imgHead.heidth, comp);
  266.  
  267.  
  268.  
  269.         }
  270.         else
  271.         {
  272.             printf("Ошибочка вышла: глубина цвета должна быть равна 24");
  273.            
  274.         }
  275.     }
  276.  
  277.     else
  278.     {
  279.         printf("Ошибочка вышла: файл неверного формата");
  280.        
  281.     }
  282.  
  283.     fclose(f);
  284.     time = clock() - time;
  285.  
  286.     fprintf(stderr, "%fc", (double)time / CLOCKS_PER_SEC);
  287.     scanf(&buffer);
  288.  
  289.     return 0;
  290. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement