| 237 | |
| 238 | |
| 239 | void Viewer::SaveMultiFrameTo(const tString& outFile, int outWidth, int outHeight) |
| 240 | { |
| 241 | Config::ProfileData& profile = Config::GetProfileData(); |
| 242 | tList<tFrame> frames; |
| 243 | for (Image* img = Images.First(); img; img = img->Next()) |
| 244 | { |
| 245 | if (!img->IsLoaded()) |
| 246 | img->Load(); |
| 247 | |
| 248 | if (!img->IsLoaded()) |
| 249 | continue; |
| 250 | |
| 251 | tImage::tPicture* currPic = img->GetCurrentPic(); |
| 252 | if (!currPic) |
| 253 | continue; |
| 254 | |
| 255 | tImage::tPicture resampled(*currPic); |
| 256 | if ((resampled.GetWidth() != outWidth) || (resampled.GetHeight() != outHeight)) |
| 257 | resampled.Resample(outWidth, outHeight, tImage::tResampleFilter(profile.ResampleFilter), tImage::tResampleEdgeMode(profile.ResampleEdgeMode)); |
| 258 | |
| 259 | tFrame* frame = new tFrame(resampled.StealPixels(), outWidth, outHeight, currPic->Duration); |
| 260 | frames.Append(frame); |
| 261 | } |
| 262 | |
| 263 | bool success = false; |
| 264 | tFileType fileType = tGetFileTypeFromName( profile.SaveFileTypeMultiFrame ); |
| 265 | switch (fileType) |
| 266 | { |
| 267 | case tFileType::GIF: |
| 268 | { |
| 269 | tImageGIF gif(frames, true); |
| 270 | tImageGIF::SaveParams params; |
| 271 | params.Format = tPixelFormat(int(tPixelFormat::FirstPalette) + profile.SaveFileGifBPP - 1); |
| 272 | params.Method = tQuantize::Method(profile.SaveFileGifQuantMethod); |
| 273 | params.Loop = profile.SaveFileGifLoop; |
| 274 | params.AlphaThreshold = profile.SaveFileGifAlphaThreshold; |
| 275 | params.OverrideFrameDuration = profile.SaveFileGifDurMultiFrame; |
| 276 | params.DitherLevel = double(profile.SaveFileGifDitherLevel); |
| 277 | params.FilterSize = (profile.SaveFileGifFilterSize * 2) + 1; |
| 278 | params.SampleFactor = profile.SaveFileGifSampleFactor; |
| 279 | success = gif.Save(outFile, params); |
| 280 | break; |
| 281 | } |
| 282 | |
| 283 | case tFileType::WEBP: |
| 284 | { |
| 285 | tImageWEBP webp(frames, true); |
| 286 | success = webp.Save(outFile, profile.SaveFileWebpLossy, profile.SaveFileWebpQualComp, profile.SaveFileWebpDurMultiFrame); |
| 287 | break; |
| 288 | } |
| 289 | |
| 290 | case tFileType::APNG: |
| 291 | { |
| 292 | tImageAPNG apng(frames, true); |
| 293 | tImageAPNG::SaveParams params; |
| 294 | params.OverrideFrameDuration = profile.SaveFileApngDurMultiFrame; |
| 295 | tImageAPNG::tFormat savedFormat = apng.Save(outFile, params); |
| 296 | success = (savedFormat != tImageAPNG::tFormat::Invalid); |