Monday, March 9, 2026

Matlab: Compress the file size for gif files

% ────────────────────────────────────────────────
% Compress large GIF → smaller GIF (same size, fewer colors)
% ────────────────────────────────────────────────

inputGif  = 'original.gif';      % ← change this
outputGif = 'compressed_version.gif';

[frames, map] = imread(inputGif, 'Frames', 'all');

if size(frames,3) == 3
    isRGB = true;
else
    isRGB = false;
end

nFrames = size(frames, 4);

% ── Super aggressive settings ──
nColors     = 16;          % try 12 or 8 if still too big
useDither   = false;       % no dither = smaller
delayFactor = 4.0;         % 4× slower → big size win
frameStep   = 3;           % keep only every 3rd frame (big reduction)

newFrames = cell(1, floor(nFrames / frameStep));
globalMap = [];

k = 1;
for i = 1:frameStep:nFrames
    if isRGB
        thisFrame = frames(:,:,:,i);
    else
        thisIndexed = frames(:,:,:,i);
        thisFrame   = ind2rgb(thisIndexed, map);
    end
    
    if k == 1
        if useDither
            [indexed, globalMap] = rgb2ind(thisFrame, nColors);
        else
            [indexed, globalMap] = rgb2ind(thisFrame, nColors, 'nodither');
        end
    else
        if useDither
            indexed = rgb2ind(thisFrame, globalMap);
        else
            indexed = rgb2ind(thisFrame, globalMap, 'nodither');
        end
    end
    
    newFrames{k} = indexed;
    k = k + 1;
end

% Timing – slow it down a lot
info      = imfinfo(inputGif);
origDelay = info(1).DelayTime / 100;
newDelay  = origDelay * delayFactor;
if newDelay < 0.05, newDelay = 0.05; end  % reasonable min

% Write
imwrite(newFrames{1}, globalMap, outputGif, 'gif', ...
    'LoopCount', Inf, ...
    'DelayTime', newDelay);

for kk = 2:numel(newFrames)
    imwrite(newFrames{kk}, globalMap, outputGif, 'gif', ...
        'WriteMode', 'append', ...
        'DelayTime', newDelay);
end

% Report
origSize = dir(inputGif).bytes  / 1e6;
newSize  = dir(outputGif).bytes / 1e6;
fprintf('MATLAB: %.0f MB → %.0f MB (%.0f%% smaller)\n', origSize, newSize, (origSize-newSize)/origSize*100);
disp(['Saved: ' outputGif]);

No comments:

Post a Comment