Guest User

Untitled

a guest
Apr 22nd, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.00 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <cs50.h>
  4.  
  5. #include "bmp.h"
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9. // ensure proper usage
  10. if (argc != 4)
  11. {
  12. fprintf(stderr, "Usage: copy infile outfile\n");
  13. return 1;
  14. }
  15.  
  16. int n = atoi(argv[1]);
  17.  
  18. // remember filenames
  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. int oldWidth = bi.biWidth;
  58. int oldHeight ;
  59. oldHeight = bi.biHeight;
  60.  
  61.  
  62. bi.biWidth = bi.biWidth * n ;
  63. bi.biHeight = bi.biHeight * n;
  64.  
  65. // determine padding for scanlines
  66. int originalpadding;
  67. originalpadding = (4 - (oldWidth * sizeof(RGBTRIPLE)) % 4) % 4;
  68. int padding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;
  69.  
  70. bi.biSizeImage = abs(bi.biHeight) * ((bi.biWidth * sizeof (RGBTRIPLE)) + padding);
  71. bf.bfSize = bi.biSizeImage + sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER);
  72.  
  73. for (int m = 0; m < n; m++)
  74. {
  75. // write outfile's BITMAPFILEHEADER
  76. fwrite(&bf, sizeof(BITMAPFILEHEADER), 1, outptr);
  77.  
  78. // write outfile's BITMAPINFOHEADER
  79. fwrite(&bi, sizeof(BITMAPINFOHEADER), 1, outptr);
  80. }
  81.  
  82.  
  83.  
  84.  
  85. // iterate over infile's scanlines
  86. for (int i = 0, bibiHeight = abs(bi.biHeight); i < bibiHeight; i++)
  87. {
  88. for (int d = 0; d < n; d++)
  89. {
  90.  
  91. // iterate over pixels in scanline
  92. for (int j = 0; j < bi.biWidth; j++)
  93. {
  94. // temporary storage
  95. RGBTRIPLE triple;
  96.  
  97. // read RGB triple from infile
  98. fread(&triple, sizeof(RGBTRIPLE), 1, inptr);
  99.  
  100. for (int s = 0; s < n; s++)
  101. {
  102. // write RGB triple to outfile
  103. fwrite(&triple, sizeof(RGBTRIPLE), 1, outptr);
  104. }
  105. }
  106. }
  107.  
  108. // skip over padding, if any
  109. fseek(inptr, padding, SEEK_CUR);
  110.  
  111. // then add it back (to demonstrate how)
  112. for (int k = 0; k < padding; k++)
  113. {
  114. fputc(0x00, outptr);
  115. }
  116.  
  117. }
  118.  
  119. // close infile
  120. fclose(inptr);
  121.  
  122. // close outfile
  123. fclose(outptr);
  124.  
  125. // success
  126. return 0;
  127. }
Add Comment
Please, Sign In to add comment