jpegdecode.m
上传用户:hwtw888
上传日期:2016-03-15
资源大小:177k
文件大小:1k
源码类别:

压缩解压

开发平台:

Matlab

  1. function x = jpegdecode(y)
  2. %jpegdecode函数,jpegencode的解码程序
  3. error(nargchk(1, 1, nargin));      %检查输入参数
  4. m = [16 11 10 16 24 40 51 61       %JPEG量化步长矩阵
  5.      12 12 14 19 26 58 60 55
  6.      14 13 16 24 40 57 69 56
  7.      14 17 22 29 51 87 80 62
  8.      18 22 37 56 68 109 103 77
  9.      24 35 55 64 81 104 113 92
  10.      49 64 78 87 103 121 120 101
  11.      72 92 95 98 112 110 103 99];
  12.  order = [1 9 2 3 10 17 25 18 11 4 5 12 19 26 33 ...        %变换系数排列次序
  13.        41 34 27 20 13 6 7 14 21 28 35 42 49 57 50 ...
  14.        43 36 29 22 15 8 16 23 30 37 44 51 58 59 52 ...
  15.        45 38 31 24 32 39 46 53 60 61 54 47 40 48 55 62 63 56 64];
  16. rev = order;          %计算逆序
  17. for k = 1:length(order)
  18.     rev(k) = find(order == k);
  19. end
  20. % ff = max(rev(:)+1;
  21. m = double(y.quality)/100*m;
  22. xb = double(y.numblocks);          %得到图像块数
  23. sz = double(y.size);
  24. xn = sz(1);
  25. xm = sz(2);
  26. x = huffdecode(y.huffman, y.info);    %huffman1解码
  27. x = double(x) - 128;
  28. eob = max(x(:));
  29. z = zeros(64, xb);
  30. k = 1;
  31. for j = 1: xb
  32.     for i = 1: 64
  33.         if x(k) == eob
  34.             k = k + 1;
  35.             break;
  36.         else
  37.             z(i, j) = x(k);
  38.             k = k + 1;
  39.         end
  40.     end
  41. end
  42. z = z(rev, :);               %恢复次序
  43. x = col2im(z, [8, 8], [xm, xn], 'distinct');       %重新排列成图像
  44. x = blkproc(x, [8, 8], 'x.*P1', m);                %逆量化
  45. t = dctmtx(8);
  46. x = blkproc(x, [8, 8], 'P1*x*P2', t', t);          %DCT逆变换
  47. x = uint8(x + 128);                                %进行位移