图像处理的简单优化-01:结构设计

说明

《图像处理的简单优化》系列以图像灰度化为例,演示图像处理的简单优化技巧。


设定

出于简化结构设计和数据处理的考虑,做出以下设定:

1.图像数据都缓存在内存中;

2.图像使用ARGB的像素格式;

3.使用C++;

4.虽然程序是Linux下开发的,但基本原理在Windows下也适用;

5.整个环境运行在虚拟机下,所得数据仅做参考,不代表真实性能;

6.使用libjpeg-turbo库,以jpeg文件为示例;


主机配置

图像处理的简单优化-01:结构设计_第1张图片


虚拟机配置:

图像处理的简单优化-01:结构设计_第2张图片


程序结构设计

假定基于每种图像格式都有一个类,并以格式名字命名,如Jpeg,Png等。这些类都继承自Image。图像处理类都基于Effect,比如灰度化处理的类Grayscale。

Image.applyEffect(Effect*)会应用Effect进行处理。其代码如下所示:

class Image
{
        ......
        virtual bool applyEffect(Effect* effect)
	{
		if (!this->available())
			return false;

		return effect->execute(m_data, this->width(), this->height());
	}

        ........

m_data是内存中的图像数据。

Image.open()和Image.save()是纯虚函数,交由子类实现。

        ......
        virtual bool save(const string& filename) = 0;

	virtual bool open(const string& filename) = 0;

各个图像格式子类都要完成一个任务:打开图像文件并将数据转换成ARGB的格式填充到缓冲区m_data中。

比如在Jpeg类中:

        void readLinesByRGB(struct jpeg_decompress_struct& _info, JSAMPARRAY _buffer)
	{
		int _lines = 0;
		unsigned char* _psrc = NULL;
		unsigned char* _pdst = m_data;

		while(_info.output_scanline < m_height)
		{
			_lines = jpeg_read_scanlines(&_info, _buffer, JPEG_LINES_TO_READ);

			for(int l = 0; l < _lines; l++)
			{
				_psrc = _buffer[l];

				for(unsigned int w = 0; w < m_width; w++)
				{
					*_pdst++ = 0; // alpha
					*_pdst++ = *_psrc++; // red
					*_pdst++ = *_psrc++; // green
					*_pdst++ = *_psrc++; // blue

				}
			}
		}
	}

经测试,jpeg_read_scalines()一次最多读2行,只能写成这样了。关于libjpeg-tuber的更详细指南,请 看这里。关于jpeg的详细说明,请 参考维基。


你可能感兴趣的:(C++,优化,图像处理)