【OpenCV】学习笔记与源码分析: imread( )函数
引言
imread()函数在opencv使用比较。
bool BmpDecoder::readData(Mat& img){ uchar* data = img.data; int step = (int)img.step; bool color = img.channels() > 1; uchar gray_palette[256]; bool result = false; int src_pitch = ((m_width*(m_bpp != 15 ? m_bpp : 16) + 7)/8 + 3) & -4; int nch = color ? 3 : 1; int y, width3 = m_width*nch; if( m_offset < 0 || !m_strm.isOpened()) return false; if( m_origin == IPL_ORIGIN_BL ){ data += (m_height - 1)*step; step = -step; } AutoBuffer<uchar> _src, _bgr; _src.allocate(src_pitch + 32); if(!color){ if(m_bpp <= 8){ CvtPaletteToGray( m_palette, gray_palette, 1 << m_bpp ); } _bgr.allocate(m_width*3 + 32); } uchar *src = _src, *bgr = _bgr; try{ m_strm.setPos(m_offset); switch(m_bpp){ /************************* 1 BPP ************************/ case 1: for( y = 0; y < m_height; y++, data += step){ m_strm.getBytes( src, src_pitch ); FillColorRow1( color ? data : bgr, src, m_width, m_palette ); if( !color ) icvCvt_BGR2Gray_8u_C3C1R( bgr, 0, data, 0, cvSize(m_width,1)); } result = true; break; /************************* 4 BPP ************************/ case 4: if( m_rle_code == BMP_RGB){ for( y = 0; y < m_height; y++, data += step ) { m_strm.getBytes( src, src_pitch ); if( color ) FillColorRow4( data, src, m_width, m_palette ); else FillGrayRow4( data, src, m_width, gray_palette ); } result = true; } else if( m_rle_code == BMP_RLE4 ) // rle4 compression { uchar* line_end = data + width3; y = 0; for(;;) { int code = m_strm.getWord(); int len = code & 255; code >>= 8; if( len != 0 ) // encoded mode { PaletteEntry clr[2]; uchar gray_clr[2]; int t = 0; clr[0] = m_palette[code >> 4]; clr[1] = m_palette[code & 15]; gray_clr[0] = gray_palette[code >> 4]; gray_clr[1] = gray_palette[code & 15]; uchar* end = data + len*nch; if( end > line_end ) goto decode_rle4_bad; do { if( color ) WRITE_PIX( data, clr[t] ); else *data = gray_clr[t]; t ^= 1; } while( (data += nch) < end ); } else if( code > 2 ) // absolute mode { if( data + code*nch > line_end ) goto decode_rle4_bad; m_strm.getBytes( src, (((code + 1)>>1) + 1) & -2 ); if( color ) data = FillColorRow4( data, src, code, m_palette ); else data = FillGrayRow4( data, src, code, gray_palette ); } else { int x_shift3 = (int)(line_end - data); int y_shift = m_height - y; if( code == 2 ) { x_shift3 = m_strm.getByte()*nch; y_shift = m_strm.getByte(); } len = x_shift3 + ((y_shift * width3) & ((code == 0) - 1)); if( color ) data = FillUniColor( data, line_end, step, width3, y, m_height, x_shift3, m_palette[0] ); else data = FillUniGray( data, line_end, step, width3, y, m_height, x_shift3, gray_palette[0] ); if( y >= m_height ) break; } } result = true; decode_rle4_bad: ; } break; /************************* 8 BPP ************************/ case 8: if( m_rle_code == BMP_RGB ) { for( y = 0; y < m_height; y++, data += step ) { m_strm.getBytes( src, src_pitch ); if( color ) FillColorRow8( data, src, m_width, m_palette ); else FillGrayRow8( data, src, m_width, gray_palette ); } result = true; } else if( m_rle_code == BMP_RLE8 ) // rle8 compression { uchar* line_end = data + width3; int line_end_flag = 0; y = 0; for(;;) { int code = m_strm.getWord(); int len = code & 255; code >>= 8; if( len != 0 ) // encoded mode { int prev_y = y; len *= nch; if( data + len > line_end ) goto decode_rle8_bad; if( color ) data = FillUniColor( data, line_end, step, width3, y, m_height, len, m_palette[code] ); else data = FillUniGray( data, line_end, step, width3, y, m_height, len, gray_palette[code] ); line_end_flag = y - prev_y; } else if( code > 2 ) // absolute mode { int prev_y = y; int code3 = code*nch; if( data + code3 > line_end ) goto decode_rle8_bad; m_strm.getBytes( src, (code + 1) & -2 ); if( color ) data = FillColorRow8( data, src, code, m_palette ); else data = FillGrayRow8( data, src, code, gray_palette ); line_end_flag = y - prev_y; } else { int x_shift3 = (int)(line_end - data); int y_shift = m_height - y; if( code || !line_end_flag || x_shift3 < width3 ) { if( code == 2 ) { x_shift3 = m_strm.getByte()*nch; y_shift = m_strm.getByte(); } x_shift3 += (y_shift * width3) & ((code == 0) - 1); if( y >= m_height ) break; if( color ) data = FillUniColor( data, line_end, step, width3, y, m_height, x_shift3, m_palette[0] ); else data = FillUniGray( data, line_end, step, width3, y, m_height, x_shift3, gray_palette[0] ); if( y >= m_height ) break; } line_end_flag = 0; } } result = true; decode_rle8_bad: ; } break; /************************* 15 BPP ************************/ case 15: for( y = 0; y < m_height; y++, data += step ) { m_strm.getBytes( src, src_pitch ); if( !color ) icvCvt_BGR5552Gray_8u_C2C1R( src, 0, data, 0, cvSize(m_width,1) ); else icvCvt_BGR5552BGR_8u_C2C3R( src, 0, data, 0, cvSize(m_width,1) ); } result = true; break; /************************* 16 BPP ************************/ case 16: for( y = 0; y < m_height; y++, data += step ) { m_strm.getBytes( src, src_pitch ); if( !color ) icvCvt_BGR5652Gray_8u_C2C1R( src, 0, data, 0, cvSize(m_width,1) ); else icvCvt_BGR5652BGR_8u_C2C3R( src, 0, data, 0, cvSize(m_width,1) ); } result = true; break; /************************* 24 BPP ************************/ case 24: for( y = 0; y < m_height; y++, data += step ) { m_strm.getBytes( src, src_pitch ); if(!color) icvCvt_BGR2Gray_8u_C3C1R( src, 0, data, 0, cvSize(m_width,1) ); else memcpy( data, src, m_width*3 ); } result = true; break; /************************* 32 BPP ************************/ case 32: for( y = 0; y < m_height; y++, data += step ) { m_strm.getBytes( src, src_pitch ); if( !color ) icvCvt_BGRA2Gray_8u_C4C1R( src, 0, data, 0, cvSize(m_width,1) ); else icvCvt_BGRA2BGR_8u_C4C3R( src, 0, data, 0, cvSize(m_width,1) ); } result = true; break; default: assert(0); } } catch(...) { } return result;}=========================================================转载请注明出处:http://blog.csdn.net/songzitea/article/details/11096287=========================================================