% ──────────────────────────────────────────────── % 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]);
Monday, March 9, 2026
Matlab: Compress the file size for gif files
Labels:
Matlab
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment