View difference between Paste ID: CFcP0bky and zbRuZcrb
SHOW: | | - or go back to the newest paste.
1-
/*HELPING ME FROM SO? Thank you!
1+
/*HELPING ME FROM r/cs50? Thank you!
2
Main appears at line 91. Before that, typedef and structs.
3
Some important lines are: 138 and 173! (also in 145 the real action begins, all the other stuff from main until there are declarations, opening/reading files...that suff).
4
THANKS AGAIN!!*/
5
6
7
/**
8
 * Resizes a BMP piece by piece, just because.
9
 */
10
11
#include <stdio.h>
12
#include <stdlib.h>
13
#include <stdint.h>
14
15
/**
16
 * Common Data Types
17
 *
18
 * The data types in this section are essentially aliases for C/C++
19
 * primitive data types.
20
 *
21
 * Adapted from https://msdn.microsoft.com/en-us/library/cc230309.aspx.
22
 * See http://en.wikipedia.org/wiki/Stdint.h for more on stdint.h.
23
 */
24
typedef uint8_t  BYTE;
25
typedef uint32_t DWORD;
26
typedef int32_t  LONG;
27
typedef uint16_t WORD;
28
29
/**
30
 * BITMAPFILEHEADER
31
 *
32
 * The BITMAPFILEHEADER structure contains information about the type, size,
33
 * and layout of a file that contains a DIB [device-independent bitmap].
34
 *
35
 * Adapted from https://msdn.microsoft.com/en-us/library/dd183374(v=vs.85).aspx.
36
 */
37
typedef struct
38
{
39
    WORD bfType;
40
    DWORD bfSize;
41
    WORD bfReserved1;
42
    WORD bfReserved2;
43
    DWORD bfOffBits;
44
} __attribute__((__packed__))
45
BITMAPFILEHEADER;
46
47
/**
48
 * BITMAPINFOHEADER
49
 *
50
 * The BITMAPINFOHEADER structure contains information about the
51
 * dimensions and color format of a DIB [device-independent bitmap].
52
 *
53
 * Adapted from https://msdn.microsoft.com/en-us/library/dd183376(v=vs.85).aspx.
54
 */
55
typedef struct
56
{
57
    DWORD biSize;
58
    LONG biWidth;
59
    LONG biHeight;
60
    WORD biPlanes;
61
    WORD biBitCount;
62
    DWORD biCompression;
63
    DWORD biSizeImage;
64
    LONG biXPelsPerMeter;
65
    LONG biYPelsPerMeter;
66
    DWORD biClrUsed;
67
    DWORD biClrImportant;
68
} __attribute__((__packed__))
69
BITMAPINFOHEADER;
70
71
/**
72
 * RGBTRIPLE
73
 *
74
 * This structure describes a color consisting of relative intensities of
75
 * red, green, and blue.
76
 *
77
 * Adapted from https://msdn.microsoft.com/en-us/library/dd162939(v=vs.85).aspx.
78
 */
79
typedef struct
80
{
81
    BYTE rgbtBlue;
82
    BYTE rgbtGreen;
83
    BYTE rgbtRed;
84
} __attribute__((__packed__))
85
RGBTRIPLE;
86
//
87
//
88
//
89
//
90
//
91
//
92
//
93
int main(int argc, char *argv[])
94
{
95
    // ensure proper usage
96
    if (argc != 4)
97
    {
98
        fprintf(stderr, "Usage: ./resize k infile outfile\n");
99
        return 1;
100
    }
101
102
    // remember filenames
103
    int factor = atoi(argv[1]);
104
    char *infile = argv[2];
105
    char *outfile = argv[3];
106
107
    // open input file
108
    FILE *inptr = fopen(infile, "r");
109
    // open output file
110
    FILE *outptr = fopen(outfile, "w");
111
    // read infile's BITMAPFILEHEADER
112
    BITMAPFILEHEADER bf;
113
    fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr);
114
    // read infile's BITMAPINFOHEADER
115
    BITMAPINFOHEADER bi;
116
    fread(&bi, sizeof(BITMAPINFOHEADER), 1, inptr);
117
118
119
    //increasing height and width by factor
120
    bi.biWidth *= factor;
121
    bi.biHeight *= factor;
122
123
124
    //calculating padding from new width
125
    int padding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;
126
127
    bi.biSizeImage = ((sizeof(RGBTRIPLE) * bi.biWidth) + padding) * abs(bi.biHeight);
128
    bf.bfSize = bi.biSizeImage + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
129
    // write outfile's BITMAPFILEHEADER
130
    fwrite(&bf, sizeof(BITMAPFILEHEADER), 1, outptr);
131
    // write outfile's BITMAPINFOHEADER
132
    fwrite(&bi, sizeof(BITMAPINFOHEADER), 1, outptr);
133
134
135
136
137
    // iterate over infile's scanlines
138
    for (int i = 0, biHeight = abs(bi.biHeight); i < (biHeight / factor); i++)
139
    {
140
        // to resize vertically
141-
    //DECLARATION OF A VARIABLE TO STORE WHAT LATER WILL BE THE ORIGIN OF THE PROBLEM WE ARE DEALING HEREIN.
141+
142-
    int temporary = -bi.biWidth/factor;
142+
143
            //iterate over pixels in scanlines
144
            for (int j = 0; j < (bi.biWidth / factor); j++)
145
            {
146
                // temporary storage
147
                RGBTRIPLE triple;
148
149
                // read RGB triple from infile
150
                fread(&triple, sizeof(RGBTRIPLE), 1, inptr);
151
152
153
                // write RGB triple to outfile
154
                fwrite(&triple, sizeof(RGBTRIPLE), factor, outptr);
155
            }
156
157
            // then add it back (to demonstrate how)
158
            for (int k = 0; k < padding; k++)
159
            {
160
                fputc(0x00, outptr);
161
            }
162
163
            fseek(inptr, 0, SEEK_CUR);
164
165
166
            //in the offset down here, choosing between -3 and the division (which equals -3) returns different .bmp outputs.
167
			//set the cursor at the beginning of the line to rewrite it, for vertical resizing purposes.
168
            if (l < factor - 1)
169
            {
170
                fseek(inptr, /*-3*//*-(bi.biWidth / factor)*/, SEEK_CUR);
171
172
            }
173
        }
174
    }
175
    // close infile
176-
            //IF YOU ARE HELPING ME FROM SO (thank you), WITHIN THE FSEEK() YOU HAVE ALL THREE POSSIBLE OPTIONS:
176+
177-
            //(1)DOING THE MATH OPERATION, (2)WRITING DIRECTLY THE NUMBER -3, OR (3)WRITING THE VARIABLE (temporary)WHERE THE RESULT OF THE OPERATION HAS BEEN STORED.
177+
178-
            // ALL THREE RETURN DIFFERENT OUTPUTS
178+
179
    // success
180
    return 0;
181-
                fseek(inptr, temporary/*-3*//*-(bi.biWidth / factor)*/, SEEK_CUR);
181+