Advertisement
Guest User

resize2

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