Advertisement
Guest User

Untitled

a guest
Jan 25th, 2015
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.78 KB | None | 0 0
  1. #include<stdio.h>
  2. #include"abc.h"
  3. #include <stdlib.h>
  4.  
  5.  
  6. #define MAX_IMAGE_SIZE 512
  7.  
  8. int AllocateImage(ImageData *img, int _w, int _h, int _channels){
  9. img->data = (unsigned char *)malloc(sizeof(unsigned char)*MAX_IMAGE_SIZE*MAX_IMAGE_SIZE*_channels);
  10. if(img->data==NULL){
  11. return 0;
  12. }
  13. img->w = _w;
  14. img->h = _h;
  15. img->chan = _channels;
  16. return 1;
  17. }
  18.  
  19. void ReleaseImage(ImageData *img){
  20. free(img->data);
  21. }
  22.  
  23. void CopyImage(ImageData *imgIn, ImageData *imgOut){
  24. int j;
  25. j = AllocateImage(imgOut, imgIn->w, imgIn->h, imgIn->chan);
  26. if(j==0) {
  27. printf("Error\n\n");
  28. }
  29. imgOut = imgIn;
  30. ReleaseImage(imgOut);
  31. }
  32.  
  33. int LoadImage(const char *filename, ImageData *img){
  34. FILE *fp;
  35. char header[32];
  36. int _w, _h, _dummy;
  37. int is_binary = 0;
  38.  
  39. fp = fopen(filename, "rb");
  40. if (fp == NULL)
  41. {
  42. fprintf(stderr, "Error: cannot open file: %s\n", filename);
  43. return 0;
  44. }
  45. fscanf(fp, "%s", header);
  46. if (img->chan==1){
  47.  
  48. is_binary = (header[1] == '5');
  49. fscanf(fp, "%d %d\n", &_w, &_h);
  50. fscanf(fp, "%d¥n", &_dummy);
  51. if (_w <= 0 || _w >= MAX_IMAGE_SIZE || _h <= 0 || _h >= MAX_IMAGE_SIZE)
  52. {
  53. fprintf(stderr, "Error: invalid image size: %dx%d\n", _w, _h);
  54. fclose(fp);
  55. return 0;
  56. }
  57. if (is_binary)
  58. {
  59. int nExpectedBytes = sizeof(unsigned char) * _w * _h;
  60. int nRead = fread(img->data, sizeof(unsigned char), _w*_h, fp);
  61. if (nRead != nExpectedBytes)
  62. {
  63. fprintf(stderr, "Error: read data too little: %d\n",
  64. nRead);
  65. fclose(fp);
  66. return 0;
  67. }
  68. }
  69. else
  70. {
  71. int xi, yi;
  72. for (yi=0; yi<_h; yi++)
  73. {
  74. for (xi=0; xi<_w; xi++)
  75. {
  76. int gray;
  77. int idx = xi + _w * yi;
  78. fscanf(fp, "%d", &gray);
  79. img->data[idx] = gray;
  80. }
  81. }
  82. }
  83. fclose(fp);
  84. img->w = _w;
  85. img->h = _h;
  86. fprintf(stderr, "note: pgm image loaded: %s\n", filename);
  87. return 1;
  88. }else if (img->chan==3 ) {
  89. is_binary = (header[1] == '6');
  90. fscanf(fp, "%d %d¥n", &_w, &_h);
  91. fscanf(fp, "%d¥n", &_dummy);
  92. if (_w <= 0 || _w >= MAX_IMAGE_SIZE || _h <= 0 || _h >= MAX_IMAGE_SIZE)
  93. {
  94. fprintf(stderr, "Error: invalid image size: %dx%d\n", _w, _h);
  95. fclose(fp);
  96. return 0;
  97. }
  98. if (is_binary)
  99. {
  100. int nExpectedBytes = 3 * sizeof(unsigned char) * _w * _h;
  101. int nRead = fread(img->data, sizeof(unsigned char), 3*_w*_h, fp);
  102. if (nRead != nExpectedBytes)
  103. {
  104. fprintf(stderr, "Error: read data too little: %d\n",
  105. nRead);
  106. fclose(fp);
  107. return 0;
  108. }
  109. }
  110. else
  111. {
  112. int xi, yi;
  113. for (yi=0; yi<_h; yi++)
  114. {
  115. for (xi=0; xi<_w; xi++)
  116. {
  117. int r, g, b;
  118. int idx = 3 * (xi + _w * yi);
  119. fscanf(fp, "%d %d %d", &r, &g, &b);
  120. img->data[idx ] = r;
  121. img->data[idx+1] = g;
  122. img->data[idx+2] = b;
  123. }
  124. }
  125. }
  126. fclose(fp);
  127. return 1;
  128. }
  129. }
  130.  
  131.  
  132.  
  133. int SaveImage(const char *filename, ImageData *img){
  134. if(img->chan==1){
  135. FILE *fp;
  136. int nExpectedBytes, nWritten;
  137. if (img->w <= 0 || img->w >= MAX_IMAGE_SIZE || img->h <= 0 || img->h >= MAX_IMAGE_SIZE)
  138. {
  139. fprintf(stderr, "Error: invalid image size: %dx%d\n", img->w, img->h);
  140. return 0;
  141. }
  142. fp = fopen(filename, "wb");
  143. if ( fp == NULL )
  144. {
  145. fprintf(stderr, "Error: cannot open file: %s\n", filename);
  146. return 0;
  147. }
  148. /* ヘッダを書き込み */
  149. fprintf(fp, "P5\n%d %d\n255\n", img->w, img->h);
  150. nExpectedBytes = sizeof(unsigned char) * img->w * img->h;
  151. /* バイナリデータを書き込み */
  152. nWritten = fwrite(img->data, sizeof(unsigned char), img->w*img->h, fp);
  153. if (nWritten != nExpectedBytes)
  154. {
  155. fprintf(stderr, "Error: written data too little: %d\n", nWritten);
  156. fclose(fp);
  157. return 0;
  158. }
  159. fclose(fp);
  160. fprintf(stderr, "note: pgm image saved: %s\n", filename);
  161. return 1;
  162. }else if(img->chan==3) {
  163. FILE *fp;
  164. int nExpectedBytes, nWritten;
  165. if (img->w <= 0 || img->w >= MAX_IMAGE_SIZE || img->h <= 0 || img->h >= MAX_IMAGE_SIZE)
  166. {
  167. fprintf(stderr, "Error: invalid image size: %dx%d\n", img->w, img->h);
  168. return 0;
  169. }
  170. fp = fopen(filename, "wb");
  171. if ( fp == NULL )
  172. {
  173. fprintf(stderr, "Error: cannot open file: %s\n", filename);
  174. return 0;
  175. }
  176. /* ヘッダを書き込み */
  177. fprintf(fp, "P6\n%d %d\n255\n", img->w, img->h);
  178. nExpectedBytes = 3 * sizeof(unsigned char) * img->w * img->h;
  179. /* バイナリデータを書き込み */
  180. nWritten = fwrite(img->data, sizeof(unsigned char), 3*img->w*img->h, fp);
  181. if (nWritten != nExpectedBytes)
  182. {
  183. fprintf(stderr, "Error: written data too little: %d\n", nWritten);
  184. fclose(fp);
  185. return 0;
  186. }
  187. fclose(fp);
  188. fprintf(stderr, "note: ppm image saved: %s\n", filename);
  189. return 1;
  190. }
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement