function x = jpeg2im(y)
%IM2JPEG Compresses an image using a JPEG approximation.
% Y = IM2JPEG(X, QUALITY) compresses image X based on 8 x 8 DCT
% transforms, coefficient quantization, and Huffman symbol
% coding. Input QUALITY determines the amount of information that
% is lost and compression achieved. Y is an encoding structure
% containing fields:
%
% Y.size Size of X
% Y.numblocks Number of 8-by-8 encoded blocks
% Y.quality Quality factor (as percent)
% Y.huffman Huffman encoding structure, as returned by
% MAT2HUFF
%
% See also JPEG2IM.
% Copyright 2002-2006 R. C. Gonzalez, R. E. Woods, & S. L. Eddins
% Digital Image Processing Using MATLAB, Prentice-Hall, 2004
% $Revision: 1.5 $ $Date: 2006/07/15 20:44:34 $
%
% Revised: 3/20/06 by R.Woods to correct an 'eob' coding problem, to
% check the 'quality' input for <= 0, and to fix a warning when
% struct y is created.
error(nargchk(1, 1, nargin)); % Check input arguments
m = [16 11 10 16 24 40 51 61 % JPEG normalizing array
12 12 14 19 26 58 60 55 % and zig-zag redordering
14 13 16 24 40 57 69 56 % pattern.
14 17 22 29 51 87 80 62
18 22 37 56 68 109 103 77
24 35 55 64 81 104 113 92
49 64 78 87 103 121 120 101
72 92 95 98 112 100 103 99];
order = [1 9 2 3 10 17 25 18 11 4 5 12 19 26 33 ...
41 34 27 20 13 6 7 14 21 28 35 42 49 57 50 ...
43 36 29 22 15 8 16 23 30 37 44 51 58 59 52 ...
45 38 31 24 32 39 46 53 60 61 54 47 40 48 55 ...
62 63 56 64];
rev=order;
for k=1:length(order)
rev(k)=find(order==k);
end
m=double(y.quality)/100*m;
xb=double(y.numblocks);
sz=double(y.size);
xn=sz(2);
xm=sz(1);
x=huff2mat(y.huffman);
eob = max(x(:)); % Create end-of-block symbol
z = zeros(64,xb) ;k=1;
for j = 1:xb % Process 1 block (col) at a time
for i=1:64
if x(k)==eob
k=k+1;
end
end
end
z=z(rev,:);
x=col2im(z,[8 8],[xm xn],'distinct');
x=blkproc(x,[8 8],'x.*P1',m);
t=dctmtx(8);
x=dlkproc(x,[8 8],'P1* x *P2',t',t);
x=x+double(2^(y.bits-1));
if y.bits<=8
x=uint8(x);
else
x=uint16(x);
end