JUCE如何实现抓屏功能?

有朋友Email询问,使用C++语言和JUCE类库做GUI编程时,如何实现抓屏功能(允许用户将程序界面的某个区域或整个界面保存为图像文件)。这个问题很简单,核心思路有二:

  1. JUCE所有的可视化元素统统继承自Component类,该类有个方法:createComponentSnapshot(),其返回值为Image对象。即该方法可将调用组件的所有显示内容生成为一个Image图像。其3个参数可设置:生成当前屏幕所显示的整个区域(或某个特定区域),是否生成该组件的所有区域(包括屏幕未显示出来的),所生成的图像是否进行缩放及缩放因数(1.0f为原图大小)。
  2. 使用ImageFileFormat派生类,其对象调用writeImageToStream()即可将图像数据写入给定的文件输出流中。

由于Component类的任何对象均可设置透明度,因此可将截屏保存为png格式的图像。使用ImageFileFormat的派生类PNGImageFormat的对象即可。示例:


class SwingComponent : public Component
{
public:
    //...
    const bool saveScreenShot()
    {
        // core 1
        screenShot = createComponentSnapshot (getLocalBounds());
        FileChooser fc ("Save screenshot", File::nonexistent, "*.png");
 
        if (fc.browseForFileToSave (true))
        {
            File imgFile = fc.getResult();
 
            if (!imgFile.hasFileExtension (".png"))
                imgFile = imgFile.withFileExtension (".png");
 
            if (imgFile.existsAsFile() && !imgFile.deleteFile())
            {
                AlertWindow::showMessageBox (AlertWindow::NoIcon, "Failed", "Can't replace this file.");
                return false;
            }
          
            // core 2
            PNGImageFormat pngFormat;
            ScopedPointer imgOutStram (imgFile.createOutputStream());
 
            if (pngFormat.writeImageToStream (screenShot, *imgOutStram))
            {
                imgOutStram->flush();
                imgOutStram = nullptr;
            }
            else
            {
                AlertWindow::showMessageBox (AlertWindow::NoIcon, "Failed", "Can't write the image data.");
            }
    }        
}
 
private:
    Image screenShot;
    // ...
};

SwingCoder

如果本文对您有所启发或助益,请微信打赏

创作时间: 2016.08.07 19:40
最后修改: 2017.07.26 14:58

本文版权:UnderwaySoft   共享协议:署名-非商业使用-禁止演绎


上一篇: 用JUCE开发Android和iOS程序·1
下一篇: JUCE_LIVE_CONSTANT宏详解

 随机推荐:
Email: underwaySoft@126.com 微信公众号: UnderwaySoft