说明
《图像处理的简单优化》系列以图像灰度化为例,演示图像处理的简单优化技巧。
设定
出于简化结构设计和数据处理的考虑,做出以下设定:
1.图像数据都缓存在内存中;
2.图像使用ARGB的像素格式;
3.使用C++;
4.虽然程序是Linux下开发的,但基本原理在Windows下也适用;
5.整个环境运行在虚拟机下,所得数据仅做参考,不代表真实性能;
6.使用libjpeg-turbo库,以jpeg文件为示例;
主机配置:
虚拟机配置:
程序结构设计
假定基于每种图像格式都有一个类,并以格式名字命名,如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()); } ........
Image.open()和Image.save()是纯虚函数,交由子类实现。
...... virtual bool save(const string& filename) = 0; virtual bool open(const string& filename) = 0;
比如在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 } } } }