C++读取图片

C++图像的读入与读出

原文:https://blog.csdn.net/Miss_yuki/article/details/60882270

首先贴出有错的程序

 

  1. #include

  2. #include

  3. #include

  4. #include

  5. #include

  6.  
  7. int main (int argc, char *argv[])//输入四个参数,输出图像名称,图像宽,图像高,图像深度

  8. {

  9. FILE *out_YUV=NULL;

  10. int width=0;

  11. int height=0;

  12. int depth=0;

  13. int i=0;

  14. int j=0;

  15. unsigned char *count = NULL;

  16.  
  17.  
  18. if(argc!=5)

  19. {

  20. printf("input wrong parameter\n");

  21. return 0;

  22. }

  23.  
  24. count = (unsigned char*)malloc(width*height*sizeof(unsigned char));

  25. memset (count,0 ,width*height*sizeof(unsigned char));

  26.  
  27. width = atoi(argv[2]);//atoi作用是把字符串转换成长整型

  28. height = atoi (argv[3]);

  29. depth = atoi (argv[4]);

  30.  
  31. for (j=0;j<=4;j++)

  32. {

  33. for (i=0;i<=4;i++)

  34. {

  35. count[i] =0;

  36. count[i+j*10+5] =100;

  37. count[i+j*10+5*10] =200;

  38. count[i+j*10+5*10+5] =255;

  39. }

  40. }

  41.  
  42. out_YUV=fopen(argv[1],"wb");

  43. fwrite(count,sizeof(int),width*height,out_YUV);

  44.  
  45. return 0;

  46. }

这是一个将yuv图像分割成四块,每块显示不同灰度的简单小程序。运行后会报错,提示说堆已损坏,我从来没遇到过这个问题,查了很久也想不通,后来咨询了自家大神,大神给出的修改版如下

 

 

 
  1. #include

  2. #include

  3. #include

  4. #include

  5. #include

  6.  
  7. int main (int argc, char *argv[])//输入四个参数,输出图像名称,图像宽,图像高,图像深度

  8. {

  9. FILE *out_YUV=NULL;

  10. int width=0;

  11. int height=0;

  12. int depth=0;

  13. int i=0;

  14. int j=0;

  15. unsigned char *count = NULL;

  16.  
  17.  
  18. if(argc!=5)

  19. {

  20. printf("input wrong parameter\n");

  21. return 0;

  22. }

  23.  
  24. width = atoi(argv[2]);//atoi作用是把字符串转换成长整型

  25. height = atoi (argv[3]);

  26. depth = atoi (argv[4]);

  27. count = (unsigned char*)malloc(width*height*sizeof(unsigned char));

  28. memset (count,0 ,width*height*sizeof(unsigned char));

  29.  
  30. for (j=0;j<=4;j++)

  31. {

  32. for (i=0;i<=4;i++)

  33. {

  34. count[i] =0;

  35. count[i+j*10+5] =100;

  36. count[i+j*10+5*10] =200;

  37. count[i+j*10+5*10+5] =255;

  38. }

  39. }

  40.  
  41. out_YUV=fopen(argv[1],"wb");

  42. fwrite(count,sizeof(int),width*height,out_YUV);

  43.  
  44. return 0;

  45. }

可以看出大神只是调整了两句代码的位置。所以我前一篇代码的问题出在,我在将参数赋值给宽和高之前就开辟了随宽高变化的空间并在空间中赋零值,后面也在这个空间中设置灰度值,这样当然会出错。

 

只是一个很小的问题我却耽误了很长时间,写出来希望对其他人有帮助,也提醒自己。

下期见!

你可能感兴趣的:(c++)