Guest User

Untitled

a guest
Jan 19th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.61 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 != 3)
  12. {
  13. printf("Usage: copy infile outfile\n");
  14. return 1;
  15. }
  16.  
  17. // remember filenames
  18. char *infile = argv[1];
  19. char *outfile = argv[2];
  20.  
  21. // open input file
  22. FILE *inptr = fopen(infile, "r");
  23. if (inptr == NULL)
  24. {
  25. printf("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. printf("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. printf("Unsupported file format.\n");
  53. return 4;
  54. }
  55.  
  56. // write outfile's BITMAPFILEHEADER
  57. fwrite(&bf, sizeof(BITMAPFILEHEADER), 1, outptr);
  58.  
  59. // write outfile's BITMAPINFOHEADER
  60. fwrite(&bi, sizeof(BITMAPINFOHEADER), 1, outptr);
  61.  
  62. // determine padding for scanlines
  63. int padding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;
  64.  
  65. // iterate over infile's scanlines
  66. for (int i = 0, biHeight = abs(bi.biHeight); i < biHeight; i++)
  67. {
  68. // iterate over pixels in scanline
  69. for (int j = 0; j < bi.biWidth; j++)
  70. {
  71. // temporary storage
  72. RGBTRIPLE triple;
  73.  
  74. // read RGB triple from infile
  75. fread(&triple, sizeof(RGBTRIPLE), 1, inptr);
  76.  
  77. //use if to test if red?
  78. if (triple.rgbtRed >= 250 /*&& triple.rgbtBlue == 250 &&
  79. triple.rgbtGreen >= 250*/)
  80. {
  81. triple.rgbtRed = 0x00;
  82. triple.rgbtBlue = 0x00;
  83. triple.rgbtRed = 0x00;
  84.  
  85. }
  86.  
  87. // write RGB triple to outfile
  88. fwrite(&triple, sizeof(RGBTRIPLE), 1, outptr);
  89. }
  90.  
  91. // skip over padding, if any
  92. fseek(inptr, padding, SEEK_CUR);
  93.  
  94. // then add it back (to demonstrate how)
  95. for (int k = 0; k < padding; k++)
  96. {
  97. fputc(0x00, outptr);
  98. }
  99. }
  100.  
  101. // close infile
  102. fclose(inptr);
  103.  
  104. // close outfile
  105. fclose(outptr);
  106.  
  107. // success
  108. return 0;
  109. }
Add Comment
Please, Sign In to add comment