· 7 years ago · Dec 23, 2018, 01:54 PM
1#include <stdio.h>
2#include <malloc.h>
3
4unsigned int xorshift32(unsigned int seed) {
5
6 unsigned int r = seed;
7
8 r = r ^ r << 13;
9 r = r ^ r >> 17;
10 r = r ^ r << 5;
11
12 return r;
13
14}
15
16void XorShiftArrayConstruct(unsigned int **XSArray, int dimXSArray, unsigned int *seed) {
17
18 int i;
19
20 *XSArray = (unsigned int) malloc(dimXSArray * sizeof(unsigned int));
21
22 for (i = 0; i < dimXSArray; i++) {
23 XSArray[i] = xorshift32(*seed);
24 *seed = XSArray[i];
25 }
26}
27
28unsigned char *CitireLiniarizare(char *bmpIn) {
29
30
31 FILE *fin;
32 unsigned int dim_img, latime_img, inaltime_img;
33 unsigned char pRGB[3], header[54], aux;
34
35 fin = fopen(bmpIn, "rb");
36
37 if (fin == NULL) {
38 printf("nu am gasit imaginea sursa din care citesc");
39 return 0;
40 }
41
42 //citesc dimensiunile de la octetul 18 respectiv 22
43 fseek(fin, 18, SEEK_SET);
44 fread(&latime_img, sizeof(unsigned int), 1, fin);
45 fread(&inaltime_img, sizeof(unsigned int), 1, fin);
46 printf("Dimensiunea imaginii in pixeli (latime x inaltime): %u x %u\n", latime_img, inaltime_img);
47
48
49
50 unsigned char *liniarizare;//creez vectorul pentru liniarizarea matricei
51 unsigned char k = 0;//k reprezinta contorul pozitiilor din vectorul liniarizare
52
53 liniarizare = (unsigned char *) malloc((3 * inaltime_img * latime_img) * sizeof(unsigned char));
54
55
56 /*for (k = 0; k < 54; k++)
57 fread(&liniarizare[k], 1, 1, fin);//adaug headerul in vectorul liniarizare*/
58
59 fseek(fin, 54, SEEK_SET);
60 //creez o matrice temporara de care sa ma ajut pentru a liniariza
61 unsigned char **temp;
62 temp = (unsigned char **) malloc(inaltime_img * sizeof(unsigned char *));
63
64 int i, j;
65 for (i = 0; i < inaltime_img; i++) {
66 *(temp + i) = (unsigned char *) malloc((3 * latime_img) * sizeof(unsigned char));
67 for (j = 0; j < 3 * latime_img; j++) {
68
69 fread(&temp[i][j], 1, 1, fin);
70
71 }
72 }
73
74
75 for (i = inaltime_img - 1; i >= 0; i--)
76 for (j = 0; j < 3 * latime_img; j++)
77 liniarizare[k++] = temp[i][j];
78
79
80 //eliberam memoria matricei temporare
81 for (i = 0; i < inaltime_img; i++) {
82 free(temp[i]);
83 }
84 free(temp);
85 fclose(fin);
86 return liniarizare;
87}
88
89
90int main() {
91 char bmpIn[] = "peppers.bmp";
92 char secretKey[] = "secret_key.txt";
93
94
95 FILE *fin_secret_key = fopen(secretKey, "r");
96 if (fin_secret_key == NULL) {
97 printf("Fisierul secret_key.txt nu a putut fi deschis");
98 }
99 unsigned int seed = fscanf(fin_secret_key, "%u", &seed);
100
101
102 unsigned int dimXSArray = 4, *XSArray;//todo vezi ca trebuie schimbata dimensiunea vectorulu XS
103 XorShiftArrayConstruct(&XSArray, dimXSArray, &seed);
104
105 int latime_img,inaltime_img;
106 unsigned char *new;
107
108 FILE *fin;
109 fin = fopen(bmpIn, "rb");
110
111 if (fin == NULL) {
112 printf("nu am gasit imaginea sursa din care citesc");
113 return 0;
114 }
115
116 //citesc dimensiunile de la octetul 18 respectiv 22
117 fseek(fin, 18, SEEK_SET);
118 fread(&latime_img, sizeof(unsigned int), 1, fin);
119 fread(&inaltime_img, sizeof(unsigned int), 1, fin);
120 printf("Dimensiunea imaginii in pixeli (latime x inaltime): %u x %u\n", latime_img, inaltime_img);
121 rewind(fin);
122 new=CitireLiniarizare(bmpIn);
123
124 FILE *fout=fopen("enc_peppers1.bmp","wb");
125 int i;
126 unsigned char x;
127 for(i=0;i<54;i++)
128 fwrite()
129 fwrite(new,1,latime_img*inaltime_img*3+54,fout);
130}