canvas教程

jpg, gif, png, bmp 之间转换

字号+ 作者:H5之家 来源:H5之家 2017-09-09 12:06 我要评论( )

本文内容用到的头文件: 类/模板描述头文件 (XE2 之后)头文件 (XE 之前) TGIFImage.gif 图片/动画#include Vcl.Imaging.GIFImg.hpp#include GIFImg.hpp TJPEGImage.jpg 图片/JPEG 图片#include Vcl.Imaging.jpeg.hpp#include jpeg.hpp TPngImage.png 图片#in

本文内容用到的头文件:

类/模板 描述 头文件 (XE2 之后) 头文件 (XE 之前)

TGIFImage .gif 图片/动画 #include <Vcl.Imaging.GIFImg.hpp> #include <GIFImg.hpp>

TJPEGImage .jpg 图片/JPEG 图片 #include <Vcl.Imaging.jpeg.hpp> #include <jpeg.hpp>

TPngImage .png 图片 #include <Vcl.Imaging.pngimage.hpp> #include <pngimage.hpp>

TBitmap .bmp 图片/位图 #include <Vcl.Graphics.hpp> #include <Graphics.hpp>

TPicture 支持加载 .gif, .jpg, .png, .bmp, .emf, .tif 等 #include <Vcl.Graphics.hpp> #include <Graphics.hpp>

std::auto_ptr 自动指针 #include <memory> #include <memory>

TGIFImage, TJPEGImage, TPngImage, TBitmap 都是从 TGraphic 继承来的,他们之间可以通过 Assign 方法来互相复制显示的内容。

 

jpg, png, bmp 转 gif 动画

  这个例子是把 jpg, png, bmp 等几张图片合成一个 gif 动画,相当于循环播放这些图片的效果
  如果是单张图片,就是静态的 gif 图片,如果要

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  std::auto_ptr<TPicture>picture(new TPicture);
  std::auto_ptr<TGIFImage>gif(new TGIFImage);
  std::auto_ptr<TStringList>slFiles(new TStringList);

  // 图片文件名,显示时间 (时间单位为 0.01 秒)
  slFiles->AddPair(L"d:\\a.png", 20); // 第 1 帧:a.png, 显示时间:20 个单位 = 0.2 秒
  slFiles->AddPair(L"d:\\b.bmp", 30); // 第 2 帧:b.bmp, 显示时间:30 个单位 = 0.3 秒
  slFiles->AddPair(L"d:\\c.jpg", 50); // 第 3 帧:c.jpg, 显示时间:50 个单位 = 0.5 秒
  slFiles->AddPair(L"d:\\d.png", 50); // 第 4 帧:d.png, 显示时间:50 个单位 = 0.5 秒

  for(int i=0; i<slFiles->Count; i++)
   {
     TGIFFrame *lpFrame = new TGIFFrame(gif.get());   // gif 里面新增一个空白帧 lpFrame

     picture->LoadFromFile(slFiles->Names[i]);        // 加载第 i 个 图片文件
     lpFrame->Assign(picture->Graphic);               // 把图片的内容复制到 lpFrame 帧里面

     if(i==0)                                         // 第一帧要添加 gif 循环播放的次数
      {
        TGIFAppExtNSLoop *loop = new TGIFAppExtNSLoop(lpFrame);
        loop->Loops = 0;                              // 0 为无限次循环,>0 为实际循环次数
      }

     // 给每一帧添加这一帧显示的时间 // u o - /o·sudd·//:d
     TGIFGraphicControlExtension *gce = new TGIFGraphicControlExtension(lpFrame);
     gce->Delay = slFiles->ValueFromIndex[i].ToInt(); // 这一帧的显示时间为第 i 个图片的显示时间
   }

  gif->SaveToFile(L"d:\\test.gif");                   // 保存 gif 到文件 d:\\test.gif
}

 

jpg 转 gif, png, bmp

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  std::auto_ptr<TJPEGImage>jpg(new TJPEGImage);
  std::auto_ptr<TGIFImage>gif(new TGIFImage);
  std::auto_ptr<TPngImage>png(new TPngImage);
  std::auto_ptr<TBitmap>bmp(new TBitmap);

  jpg->LoadFromFile(L"D:\\a.jpg");  // 加载 a.jpg 图片
  bmp->Assign(jpg.get());           // jpg 转为 bmp
  gif->Assign(bmp.get());           // 再由 bmp 转为 gif
  png->Assign(bmp.get());           // 再由 bmp 转为 png

  bmp->SaveToFile(L"d:\\test.bmp"); // 保存 bmp 到 test.bmp
  gif->SaveToFile(L"d:\\test.gif"); // 保存 gif 到 test.gif
  png->SaveToFile(L"d:\\test.png"); // 保存 png 到 test.png
}

 

gif 转 jpg, png, bmp, 每一帧存为一个图片

void __fastcall TForm1::Button3Click(TObject *Sender)
{
  std::auto_ptr<TGIFImage>gif(new TGIFImage);
  std::auto_ptr<TBitmap>bmp(new TBitmap);
  std::auto_ptr<TPngImage>png(new TPngImage);
  std::auto_ptr<TJPEGImage>jpg(new TJPEGImage);
  // Copyright Victor Chen,
  gif->LoadFromFile(L"D:\\a.gif");                          // 加载 a.gif
  for(int i=0; i<gif->Images->Count; i++)                   // 一共有 gif->Images->Count 帧
   {
     TGIFFrame *lpFrame = gif->Images->Frames[i];           // 第 i 帧
     if(i==0)
       bmp->Assign(lpFrame);                                // 第一帧是完整的图片
     else                                                   // 之后的帧需要画在前一帧上才是完整的图片
       lpFrame->Draw(bmp->Canvas,TRect(0,0,bmp->Width,bmp->Height),true,true);
     bmp->SaveToFile(String().sprintf(L"d:\\b%02d.bmp",i)); // 第 i 帧存为第 i 个 bmp 文件

     png->Assign(bmp.get());
     png->SaveToFile(String().sprintf(L"d:\\p%02d.png",i)); // 第 i 帧存为第 i 个 png 文件

     jpg->Assign(bmp.get());
     jpg->SaveToFile(String().sprintf(L"d:\\j%02d.jpg",i)); // 第 i 帧存为第 i 个 jpg 文件
   }
}

 

png 转 jpg, gif, bmp

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • canvas 和 express 的一款图片格式转换工具

    canvas 和 express 的一款图片格式转换工具

    2017-07-21 09:04

  • JS工具库封装:Video转换成Canvas

    JS工具库封装:Video转换成Canvas

    2017-06-27 16:01

  • 使用toBlob()方法将canvas对象转换为Blob对象

    使用toBlob()方法将canvas对象转换为Blob对象

    2017-06-06 13:04

  • HTML5网页中SVG和Canvas以及IMG图片的转换方法

    HTML5网页中SVG和Canvas以及IMG图片的转换方法

    2017-05-06 09:05

网友点评