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 | + |