Advertisement
WykopProgramista

Resize v2

Jul 19th, 2018
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.26 KB | None | 0 0
  1. // Resizes a BMP file
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #include "bmp.h"
  7.  
  8. int main(int argc, char *argv[])
  9. {
  10.     // ensure proper usage
  11.     if (argc != 4)
  12.     {
  13.         fprintf(stderr, "Usage: ./resize, factor by which BMP is resized, infile, outfile\n");
  14.         return 1;
  15.     }
  16.  
  17.     float n = atof(argv[1]);
  18.     char *infile = argv[2];
  19.     char *outfile = argv[3];
  20.  
  21.     // open input file
  22.     FILE *inptr = fopen(infile, "r");
  23.     if (inptr == NULL)
  24.     {
  25.         fprintf(stderr, "Could not open %s.\n", infile);
  26.         return 2;
  27.     }
  28.  
  29.     // open output file
  30.     FILE *outptr = fopen(outfile, "w");
  31.     if (outptr == NULL)
  32.     {
  33.         fclose(inptr);
  34.         fprintf(stderr, "Could not create %s.\n", outfile);
  35.         return 3;
  36.     }
  37.  
  38.     // read infile's BITMAPFILEHEADER
  39.     BITMAPFILEHEADER bf;
  40.     fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr);
  41.  
  42.     // read infile's BITMAPINFOHEADER
  43.     BITMAPINFOHEADER bi;
  44.     fread(&bi, sizeof(BITMAPINFOHEADER), 1, inptr);
  45.  
  46.     // ensure infile is (likely) a 24-bit uncompressed BMP 4.0
  47.     if (bf.bfType != 0x4d42 || bf.bfOffBits != 54 || bi.biSize != 40 ||
  48.         bi.biBitCount != 24 || bi.biCompression != 0)
  49.     {
  50.         fclose(outptr);
  51.         fclose(inptr);
  52.         fprintf(stderr, "Unsupported file format.\n");
  53.         return 4;
  54.     }
  55.  
  56.     // dimensions of original picture
  57.     int originalWidth = bi.biWidth;
  58.     int originalHeight = abs(bi.biHeight);
  59.     int padding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;
  60.  
  61.     // dimensions of resized picture
  62.     bi.biWidth = floor(n*bi.biWidth);
  63.     bi.biHeight = floor(n*bi.biHeight);
  64.     int paddingResize = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;
  65.     bi.biSizeImage = ((sizeof(RGBTRIPLE)*bi.biWidth)+paddingResize)*abs(bi.biHeight);
  66.     bf.bfSize = bi.biSizeImage + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  67.  
  68.     // write outfile's BITMAPFILEHEADER
  69.     fwrite(&bf, sizeof(BITMAPFILEHEADER), 1, outptr);
  70.  
  71.     // write outfile's BITMAPINFOHEADER
  72.     fwrite(&bi, sizeof(BITMAPINFOHEADER), 1, outptr);
  73.    
  74.     // create array that stores pixels of original picture
  75.     RGBTRIPLE pixels[originalHeight][originalWidth];
  76.    
  77.     // iterate over infile's scanlines
  78.     for (int row = 0; row < originalHeight; row++)
  79.     {
  80.         // iterate over pixels in scanline
  81.         for (int col = 0; col < originalWidth; col++)
  82.         {
  83.             //put pixel in array
  84.             fread(&pixels[row][col], sizeof(RGBTRIPLE), 1, inptr);
  85.         }
  86.         fseek(inptr, padding, SEEK_CUR);
  87.     }
  88.    
  89.     // writes resized image to outfile
  90.     for(int row = 0; row < originalHeight; row++)
  91.     {
  92.         for(int resizeVertical = 0; resizeVertical < n; resizeVertical++)
  93.         {
  94.             for(int col = 0; col < originalWidth; col++)
  95.             {
  96.                 for(int resizeH = 0; resizeH < n; resizeH++)
  97.                 {
  98.                     fwrite(&pixels[row][col], sizeof(RGBTRIPLE), 1, outptr);
  99.                 }
  100.             }
  101.             for (int k = 0; k < paddingResize; k++)
  102.             {
  103.                 fputc(0x00, outptr);
  104.             }
  105.         }
  106.     }
  107.  
  108.     // close infile
  109.     fclose(inptr);
  110.  
  111.     // close outfile
  112.     fclose(outptr);
  113.  
  114.     // success
  115.     return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement