rahulb5

Untitled

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