jpegencode.m
上传用户:mgf822
上传日期:2022-06-06
资源大小:51k
文件大小:1k
源码类别:

压缩解压

开发平台:

Matlab

  1. function y=jpegencode(x,quality)
  2. error(nargchk(1,2,nargin));
  3. if nargin<2
  4.     quality=1;
  5. end
  6. x=double(x)-128;
  7. [xm,xn]=size(x);
  8. t=dctmtx(8);
  9. y=blkproc(x,[8 8],'P1*x*P2',t,t');
  10. m=[16 11 10 16 24 40 51 61
  11.     12 12 14 19 26 58 60 55
  12.     14 13 16 24 40 57 69 56 
  13.     14 17 22 29 51 87 80 62
  14.     18 22 37 56 68 109 103 77
  15.     24 35 55 64 81 104 113 92
  16.     49 64 78 87 103 121 120 101 
  17.     72 92 95 98 112 100 103 99]*quality;
  18. ttt=ones(8,8)*10;
  19. m=ttt*quality;
  20. yy=blkproc(y,[8 8],'round(x./P1)',m);
  21. y=im2col(yy,[8 8],'distinct');
  22. xb=size(y,2);
  23. order=[1 9 2 3 10 17 25 18 11 4 5 12 19 26 33 ...
  24.        41 34 27 20 13 6 7 14 21 28 35 42 49 57 50 ...
  25.        43 36 29 22 15 8 16 23 30 37 44 51 58 59 52 ...
  26.        45 38 31 24 32 39 46 53 60 61 54 47 40 48 55 62 63 56 64];
  27.    y=y(order,:);
  28.    eob=max(x(:))+1;
  29.    num=numel(y)+size(y,2);
  30.    r=zeros(num,1);
  31.    count=0;
  32.    for j=1:xb
  33.        i=max(find(y(:,j)));
  34.        if isempty(i)
  35.            i=0;
  36.        end
  37.        p=count+1;
  38.        q=p+i;
  39.        r(p:q)=[y(1:i,j);eob];
  40.        count=count+i+1;
  41.    end
  42.    r((count+1):end)=[];
  43.    r=r+128;
  44.    y.size=uint16([xm,xn]);
  45.    y.numblocks=uint16(xb);
  46.    y.quality=uint16(quality*100);
  47.    [y.huffman y.info]=huffencode(uint8(r));
  48.    
  49.    
  50.