osgEarth示例分析——osgearth_noisegen

前言

osgearth_noisegen示例,展示生成噪音图。也就是根据设置生成声音曲线,在绘制到图上。但是写入文件总是报错。

osgDB::writeImageFile 这个方法,我的理解,它就是要把输入的内容输出到二维图文件中的。并且也进行了测试,但是却行不通。

执行命令:osgearth_noisegend.exe --size 10    // 其他参数都设置默认了

代码分析

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace osgEarth;
using namespace osgEarth::Drivers;
using namespace osgEarth::Util;

int usage()
{
    OE_WARN << "\n"
        "osgearth_noisegen --size n             ; image dimension\n"
        "                  --out string         ; output filename\n"
        "                  [--frequency n]      ; default = 16\n"
        "                  [--octaves n]        ; default = 12\n"
        << std::endl;
    return -1;
}
/**
 * How to create a simple osgEarth map and display it.
 * 如何创建一个简单地图并展示
 */
int
main(int argc, char** argv)
{
    osg::ArgumentParser arguments(&argc,argv);

	// 传入尺寸
    int dim;
    if (!arguments.read("--size", dim))
        return usage();

	// 输出文件名。
	// 如果设置为如下格式,则会分别报错如下:
	// git tif:not implemented
	// png jpg:write error
	// osg :file not handled
	// osgb:虽然此格式不会报错,但是生成的osgb用osgviewer.exe 却无法打开。
    std::string out = "out.jpg";
    //if (!arguments.read("--out", out))
    //    return usage();

	// 频率默认16.0
    double freq = 16.0;
    arguments.read("--frequency", freq);

	// 12个8度音阶??
    int octaves = 12;
    arguments.read("--octaves", octaves);

	// SimplexNoise 单工噪声发生器类。
    SimplexNoise noise;
    noise.setFrequency(freq);
    noise.setOctaves(octaves);
    noise.setNormalize(true);// 对声音进行归一化
	// 创建所需尺寸dim的可平铺图像,
	// 图像将在[0..1]范围内进行直方图拉伸。
    osg::Image* image = noise.createSeamlessImage(dim);
	// 将图片写入文件中
    osgDB::writeImageFile(*image, out);// jpg 文件写入错误


	// 测试wirteImageFile方法,先读取一个jpg,再保存输出jpg
	//osg::ref_ptr img = new osg::Image;
	//img = osgDB::readImageFile("D:\\FreeXGIS\\osgearth_gch\\data\\resources\\textures_us\\commercial\\1Flint_sm.jpg");
	//osg::ref_ptr img2 = new osg::Image;
	//img2->setImage(img->s(), img->t(), img->r(), img->getInternalTextureFormat(), img->getPixelFormat(), img->getDataType(), img->data(), img->getAllocationMode());
	//osgDB::writeImageFile(*img2, "img2.jpg");

    return 0;
}

你可能感兴趣的:(osgEarth,c++)