In the process of image processing and storage optimization, the JPEG compression ratio directly affects image quality and file size. This example demonstrates the implementation of JPEG image compression, intuitively presenting the relationship between image effects and file sizes at different compression ratios.
1. Code
%% JPEG compression processing with different quality ratios
im = imread('llama.jpg');
% Ensure the img folder exists, create it if it does not
if ~exist('img', 'dir')
mkdir('img');
end
%% Write images with different JPG compression ratios
jpegQuality = 10:10:100;
numObservations = numel(jpegQuality);
compressedFrames = cell(1,numObservations);
fileSizes = zeros(1, numObservations); % For storing file sizes
for ind = 1:numObservations
q = jpegQuality(ind);
% Specify the save path as the img folder in the current directory
tempFile = fullfile('img','jpeg', ['llama_compression_',num2str(q),'.jpg']);
imwrite(im,tempFile,'Quality',q);
% Get file size
fileInfo = dir(tempFile);
fileSizes(ind) = fileInfo.bytes;
fileSizes(ind) = fileSizes(ind) / 1024;
compressedFrames{ind} = imread(tempFile); % Read back into workspace
end
%% Display and check compressed images
tiledlayout(3,2);
h1 = nexttile; imshow(compressedFrames{1}), title(['JPEG Quality: ', num2str(jpegQuality(1)), '%; Size: ', num2str(fileSizes(1), '%.2f'), ' KB']);
nexttile, imshow(compressedFrames{3}), title('JPEG Quality: 30%');
title(['JPEG Quality: ', num2str(jpegQuality(3)), '%; Size: ', num2str(fileSizes(3), '%.2f'), ' KB']);
nexttile, imshow(compressedFrames{5}), title('JPEG Quality: 50%');
title(['JPEG Quality: ', num2str(jpegQuality(5)), '%; Size: ', num2str(fileSizes(5), '%.2f'), ' KB']);
nexttile, imshow(compressedFrames{7}), title('JPEG Quality: 70%');
title(['JPEG Quality: ', num2str(jpegQuality(7)), '%; Size: ', num2str(fileSizes(7), '%.2f'), ' KB']);
nexttile, imshow(compressedFrames{9}), title('JPEG Quality: 90%');
title(['JPEG Quality: ', num2str(jpegQuality(9)), '%; Size: ', num2str(fileSizes(9), '%.2f'), ' KB']);
nexttile, imshow(im), title('Input Image (Original): 100%');
title(['JPEG Quality: ', num2str(jpegQuality(10)), '%; Size: ', num2str(fileSizes(10), '%.2f'), ' KB']);
linkaxes
2. Analysis
(1) Image reading and folder creation:
– Use imread(‘llama.jpg’) to read the image file named llama.jpg and store the image data in the variable im.
– Check if a folder named img exists in the current directory using exist(‘img’, ‘dir’); if it does not exist, create it using mkdir(‘img’) to prepare for saving compressed images.
(2) JPEG compression processing with different qualities:
– Define jpegQuality = 10:10:100 to generate a sequence of compression quality parameters ranging from 10 to 100 with a step of 10.
– Create a cell array compressedFrames to store image data of different compression qualities, and an array fileSizes to store the sizes of the corresponding compressed files (in KB).
– Loop through the jpegQuality sequence, for each compression quality parameter q:
– Use the fullfile function to construct the complete file save path tempFile, saving the compressed image in the img/jpeg subfolder, with the filename containing compression quality information (e.g., llama_compression_10.jpg).
– Call imwrite(im,tempFile,’Quality’,q) to save the original image im as a JPEG file with the specified compression quality q.
– Use dir(tempFile) to get the saved file information, extract the file size in bytes, and convert it to KB to store in the fileSizes array.
– Read the compressed image back into the workspace, storing it in the compressedFrames cell array.
(3) Image display and comparison:
– Use tiledlayout(3,2) to create a 3-row by 2-column tiled layout for displaying images.
– Sequentially display images of different compression qualities (and the original image) in each subplot, showing the compression quality percentage and file size (in KB) in the title.
For example, title([‘JPEG Quality: ‘, num2str(jpegQuality(1)), ‘%; Size: ‘, num2str(fileSizes(1), ‘%.2f’), ‘ KB’]) combines the compression quality and file size information into a string for the image title.
– Finally, use linkaxes to link the axes of all subplots, making it easier to compare different images. The following image shows the detailed comparison effect after zooming in.
3. Summary of Matlab Functions
exist: Checks whether a specified variable, file, or folder exists, and can specify the type of existence (e.g., file, directory, etc.).
mkdir: Creates a new folder (directory).
fullfile: Combines multiple path components into a complete path according to operating system rules.
imwrite: Writes image data to a file, allowing specification of image format and related parameters (such as JPEG compression quality).
dir: Retrieves detailed information about files or folders, such as size, modification time, etc.
cell: Creates a cell array for storing different types or sizes of data, such as image data of different compression qualities.
tiledlayout: Creates a tiled layout for arranging multiple subplots in a single graphics window.
nexttile: Selects the next available subplot position in the tiled layout for placing images or other plotting content.
linkaxes: Links multiple axes so that they remain synchronized during zooming, panning, and other operations, facilitating comparison of data in different subplots.
This program implements the functionality of processing images with different quality JPEG compression. By setting a series of compression quality parameters, the original image is compressed and saved to a specified folder, while obtaining the size of each compressed file. Finally, it visually displays the image effects at different compression qualities and intuitively presents the relationship between compression quality and file size, showcasing the characteristics of image compression.
If interested, further research can be conducted: study the principles of the JPEG compression algorithm; experiments can be conducted comparing existing JPEG compression with other image compression algorithms (such as PNG, WebP, etc.) to analyze the differences in image quality and file size.