Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4252924
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: C/C++

2011-06-04 20:13:57

 jpg_t.rar  

  1. /* 功能: 将jpg图片 fp转换成 bin二进制文件dstFile,
  2.             将jpg图片 fp转换为 另一个 jpg图片 out
  3.  jpg: 开始标志 0xffd8
  4.       结束标志 0xffd9

  5.  author : yuweixian
  6.  date : 2011.6.4
  7.  gcc 编译器
  8. */

  9. #include <stdio.h>
  10. #include <stdbool.h> //_Bool
  11. #include <string.h> // memset
  12. #include <stdlib.h> //exit

  13. int main()
  14. {
  15.     FILE *fp, *out, *dstFile; //fp 源图片 out 输出图片 dstFile 二进制文件
  16.     long int size; //图片 大小 fseek ftell 可以得到
  17.     unsigned char ch, ch1, ch2; //临时保存 从流文件中 读取的 一个字符
  18.     unsigned char high, low; // 字符的 高 低 字节
  19.     long int i;
  20.     char pic_name[30]; //jpg 图片 名字

  21.     memset(pic_name, 0, sizeof(char)*30); //清零

  22.     printf("please input the picture's name(such as test.jpg)...\n");
  23.     scanf("%s",pic_name);

  24.      //打开 源图片
  25.     if((fp = fopen(pic_name, "rb")) == NULL)
  26.     {
  27.         printf("can't open the jpg file\n");
  28.         exit(EXIT_FAILURE);
  29.     }

  30.     //打开 二进制文件
  31.     if((out = fopen("jpg_to_bin1.txt", "wb+")) == NULL)
  32.     {
  33.         printf("can't open the txt file\n");
  34.         exit(EXIT_FAILURE);
  35.     }

  36.     //打开 输出文件
  37.     if((dstFile = fopen("recv1.jpg", "wb+")) == NULL)
  38.     {
  39.         printf("can't open the dst.jpg file\n");
  40.         exit(EXIT_FAILURE);
  41.     }

  42.     //获取 源图片的长度
  43.     fseek(fp, 0, SEEK_END); //从文件的结束位置开始
  44.     size = ftell(fp); //获取文件刘德读取位置,图片最后的位置
  45.     printf("the size of jpg is %ld\n", size);
  46.     rewind(fp); //将流文件的读写位置移动到文件的开始位置


  47.     for(i = 0; i < size; i++)
  48.     {
  49.         ch = fgetc(fp); //从流文件中获取 一个字符
  50.         high = ch >> 4;
  51.         low = ch & 0x0f;
  52. /*
  53.         当high的值是0-9之间,asiic中字符0-9 的assic码表是 48 - 57
  54.         当high的值是大于10
  55.                     我们需要 10 对应 A 这个字符65
  56.         65 - 10 = 55

  57. */        if(high < 10)
  58.             high += '0';
  59.         else
  60.             high += 55;

  61.         if(low < 10 )
  62.             low += '0';
  63.         else
  64.             low += 55;

  65.         fputc(high, out); //将一个字符写入流文件 txt
  66.         fputc(low, out);
  67.         fputc(' ', out);
  68.         
  69.         if( i % 16 == 0) //每 16 个字符换行
  70.         fprintf(out, "\r\n");
  71.     }

  72.     rewind(fp); //重新定位,流文件的读写位置移动到文件的开始地址
  73.     _Bool format = false;
  74.     for(i = 0; i < size; i++)
  75.     { // jpg 图片开始 标志 0xffd8
  76.         ch1 = fgetc(fp);
  77.         if(ch1 == 0xff)
  78.         {
  79.             ch2 = fgetc(fp);
  80.             if(ch2 == 0xd8)
  81.             {
  82.                 fputc(ch1, dstFile);
  83.                 fputc(ch2, dstFile);
  84.                 format = true;
  85.                 break;
  86.             }// 如果是 0xffd8, 就跳出循环
  87.         }
  88.     }


  89.     if(format) //从 开始标志继续执行
  90.     {
  91.         for(; i< size; i++) //jpg结束标志 0xffd9
  92.         {
  93.             ch1 = fgetc(fp);
  94.             fputc(ch1, dstFile);
  95.             if( ch1 == 0xff)
  96.             {
  97.                 ch2 = fgetc(fp);
  98.                 if( ch2 == 0xd9)
  99.                 {
  100.                     break;
  101.                 }
  102.                 else
  103.                     fputc(ch2, dstFile);
  104.             } //当获取到 0xffd9 ,表示图片 结束
  105.         }
  106.     }

  107.     fclose(fp);
  108.     fclose(out);
  109.     fclose(dstFile);

  110.     return 0;
  111. }

阅读(1723) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~