Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.25 KB | None | 0 0
  1. /**
  2.  * Copies a BMP piece by piece, just because.
  3.  */
  4.        
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7.  
  8. #include "bmp.h"
  9.  
  10. int main(int argc, char *argv[])
  11. {
  12.     // ensure proper usage
  13.     if (argc != 4)
  14.     {
  15.         fprintf(stderr, "Usage: ./resize n infile outfile\n");
  16.         return 1;
  17.     }
  18.  
  19.     // remember filenames
  20.     int n = atoi(argv[1]);
  21.     char *infile = argv[2];
  22.     char *outfile = argv[3];
  23.  
  24.     // open input file
  25.     FILE *inptr = fopen(infile, "r");
  26.     if (inptr == NULL)
  27.     {
  28.         fprintf(stderr, "Could not open %s.\n", infile);
  29.         return 2;
  30.     }
  31.  
  32.     // open output file
  33.     FILE *outptr = fopen(outfile, "w");
  34.     if (outptr == NULL)
  35.     {
  36.         fclose(inptr);
  37.         fprintf(stderr, "Could not create %s.\n", outfile);
  38.         return 3;
  39.     }
  40.  
  41.     // read infile's BITMAPFILEHEADER
  42.     BITMAPFILEHEADER bf;
  43.     fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr);
  44.  
  45.     // read infile's BITMAPINFOHEADER
  46.     BITMAPINFOHEADER bi;
  47.     fread(&bi, sizeof(BITMAPINFOHEADER), 1, inptr);
  48.  
  49.     // ensure infile is (likely) a 24-bit uncompressed BMP 4.0
  50.     if (bf.bfType != 0x4d42 || bf.bfOffBits != 54 || bi.biSize != 40 ||
  51.         bi.biBitCount != 24 || bi.biCompression != 0)
  52.     {
  53.         fclose(outptr);
  54.         fclose(inptr);
  55.         fprintf(stderr, "Unsupported file format.\n");
  56.         return 4;
  57.     }
  58.    
  59.         // determine padding for scanlines
  60.  
  61.  
  62.     BITMAPINFOHEADER nbi = bi;
  63.     nbi.biWidth = n * bi.biWidth;
  64.     nbi.biHeight = n * bi.biHeight;
  65.     int padding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;
  66.     int npadding = (4 - (nbi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;
  67.    
  68.     nbi.biSizeImage = (nbi.biWidth * sizeof(RGBTRIPLE) + npadding) * abs(nbi.biHeight);
  69.    
  70.     BITMAPFILEHEADER nbf = bf;
  71.     nbf.bfSize = nbi.biSizeImage + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  72.    
  73.  
  74.     // write outfile's BITMAPFILEHEADER
  75.     fwrite(&nbf, sizeof(BITMAPFILEHEADER), 1, outptr);
  76.    
  77.     // write outfile's BITMAPINFOHEADER
  78.     fwrite(&nbi, sizeof(BITMAPINFOHEADER), 1, outptr);
  79.  
  80.     // iterate over infile's scanlines
  81.     for (int i = 0, biHeight = abs(bi.biHeight); i < biHeight; i++)
  82.     {
  83.         //save the row
  84.         RGBTRIPLE row[nbi.biWidth];
  85.         int index=0;
  86.         // iterate over pixels in scanline
  87.         for (int j = 0; j < bi.biWidth; j++)
  88.         {
  89.             // temporary storage
  90.            RGBTRIPLE triple;
  91.  
  92.             // read RGB triple from infile
  93.             fread(&triple, sizeof(RGBTRIPLE), 1, inptr);
  94.            
  95.             for (int k=0; k<n; k++)
  96.             {
  97.                 row[index] = triple;
  98.                 index++;
  99.             }
  100.         }
  101.            
  102.                     // skip over padding, if any
  103.             fseek(inptr, padding, SEEK_CUR);
  104.             for (int l=0; l<n; l++){
  105.                 // then add it back (to demonstrate how)
  106.                 fwrite(&row, sizeof(RGBTRIPLE)*nbi.biWidth,1,outptr);
  107.                 for (int k = 0; k < npadding; k++)
  108.                 {
  109.                     fputc(0x00, outptr);
  110.                 }
  111.        
  112.              }  
  113.        
  114.         }
  115.  
  116.  
  117.  
  118.     // close infile
  119.     fclose(inptr);
  120.  
  121.     // close outfile
  122.     fclose(outptr);
  123.     // success
  124.     return 0;
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement