JUCE图像处理之Image及相关类2-2

获取图像后的显示(绘制该图像):

// 定义并初始化Image对象,图像来源为磁盘中的文件
Image img1 = ImageFileFormat::loadFrom (File::getCurrentWorkingDirectory()
                                        .getChildFile ("img\\demo.jpg"));

g.setImageResamplingQuality (Graphics::highResamplingQuality); // 设置绘制质量

/** drawImageWithin()有7个参数,依次为:要绘制的图像对象,起点x,起点y,宽,高,图像的布局样式(枚举常量)。最后一个参数为是否填充图像的Alpha通道,有默认值,未显式给出 */
g.drawImageWithin (img1, 5, 5, img.getWidth()/2 + 10, getHeight(), 
       RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize);

// 定义并初始化第2个Image对象,图像来源为内存块数据
Image img2 = ImageCache::getFromMemory (DemoImg::imgData_jpg, 
                                        DemoImg::imgData_Size); 

// 内容组件类的paint()方法将图像绘制到界面中
g.drawImageWithin (img2, getWidth() / 2, 0, getWidth() / 2, getHeight(),
       RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize);

图像的操作处理(Image类的成员函数):(网站发布,略)

Image对象不仅仅局限于在界面中显示图像、图标、仿真物件等等,还可以灵活运用到GUI编程中的许多方面。比如:组件绘制栅格式背景或图形,使用Image比直接使用Graphics对象的效率更高,响应更敏捷。典型的例子就是音频软插件、医疗、科研等DSP程序中的条式电平表(响度仪)、幅频、相频、声场显示等等。技巧是:类中声明一个Image对象,尺寸较小,用该对象初始化一个临时定义的Graphics对象,即:让该Graphics对象在Image对象上绘制一些内容。而后组件类paint()函数的Graphics对象对该图像设置平铺,最后基于实时变化的数据fillAll()。示例如下:

void MainContentComponent::paint (Graphics& g)
{
    // 临时定义一个Graphics对象,用于绘制图像对象gridImage的所显示的内容
    // gridImage是Image对象,本类的数据成员。
    // 构造函数中已将gridImage初始化为宽高为某个较小数值的透明图像
    Graphics tg (gridImage);
    tg.setColour (Colours::blue);

    // +1的作用是:矩形最右侧和最下侧的直线绘制到区域的外面,不让其显示    
    tg.drawRect (0, 0, gridImage.getWidth() + 1, gridImage.getHeight() + 1);

    // 使用本函数的1参Graphics&对象g平铺并填充刚刚设置好的图像
    g.setTiledImageFill (gridImage, 0, 0, 1.0f);
    g.fillAll();
}

下面的代码演示了如何将图像数据保存为磁盘文件:

// 将PNG格式的图像保存到用户在FileChooser中所指定(命名)的文件中
FileOutputStream stream (chooser.getResult()); 
PNGImageFormat pngImageFormat; 
pngImageFormat.writeImageToStream (image, stream);

下面的代码则演示了处理图像的最基本思路与流程:逐个像素进行处理(嵌套循环,典型的二维数组的处理方式)。

// 增加图像的亮度
for (int v = 0; v < origImage.getHeight(); ++v) 
{
    for (int h = 0; h < origImage.getWidth(); ++h)      
    {
        Colour col = origImage.getPixelAt (h, v);

        if (amount > 0.f)
            procImage.setPixelAt (h, v, col.brighter (amount));

        else if (amount < 0.f)
            procImage.setPixelAt (h, v, col.darker (-amount));
     }
 }