close all;
clear all;

block_size = 8;
block_size = [block_size, block_size];
channels = 3;
QF = 0.1;

img = double(imread('./lena.jpg'));

%% Compress
cropped = crop(img, block_size);
x = D35WQ8_RGB_to_YCbCr(cropped);
blocks = D35WQ8_im2block(x, block_size);
dct = D35WQ8_DCT(blocks);
quant = D35WQ8_quantizer(dct, QF);
zz = D35WQ8_zigzag(quant);
rle = D35WQ8_rle_encoder(zz);

%% Decompress
re_zz = D35WQ8_rle_decoder(rle, block_size(1));
re_quant = D35WQ8_izigzag(re_zz);
re_dct = D35WQ8_dequantizer(re_quant, QF);
re_blocks = D35WQ8_IDCT(re_dct);
re_x = D35WQ8_block2im(re_blocks, size(cropped));
re_cropped = D35WQ8_YCbCr_to_RGB(re_x);

numimg = numel(img);
numrle = numel(rle);
disp(['number of data in original image: ' num2str(numimg)]);
disp(['number of data in compressed image: ' num2str(numrle)]);
disp(['quality factor: ' num2str(QF)]);
disp(['compress ratio: ' num2str(numimg/numrle)]);
imshow(uint8(re_cropped));
%rangeof(cropped)
%rangeof(re_cropped)
%imshow(uint8(double2im(re_cropped)))
%imshow(D35WQ8_block2im(dct, size(cropped)));
%  W = (cropped-re_cropped);
%  m = mean(W(:))
%  imshow(W/m);

% W = (cropped - re_cropped);
% m = mean(W(:))
% imshow((cropped - re_cropped)/m);

% 
% subplot(1,2,1);
% imshow(x);
% subplot(1,2,2)
% imshow(re_x);