64,654
社区成员
发帖
与我相关
我的任务
分享
bool CxImage::Resample3(long newx,long newy,CxImage * pDest)
{
CxImage temp;
temp.Create(newx,newy,GetBpp(),CXIMAGE_FORMAT_BMP); // 创建图像
int nBpp = GetBpp();
int nWidth = GetWidth();
int nHeight = GetHeight();
agg::rendering_buffer rbuf_src,rbuf_dest; // 关联原图
rbuf_src.attach(GetBits(0),nWidth,nHeight,GetEffWidth());
rbuf_dest.attach(temp.GetBits(0),newx,newy,temp.GetEffWidth());
if( nBpp == 24 ) // 24位图
{
agg::pixfmt_rgb24 pixf24_src(rbuf_src);
agg::pixfmt_rgb24 pixf24_dest(rbuf_dest);
// 渲染器
typedef agg::renderer_base<agg::pixfmt_rgb24> renderer_base_type;
renderer_base_type renb(pixf24_dest);
// 线段分配器
typedef agg::span_allocator<agg::rgba8> span_allocator_type;
span_allocator_type span_alloc;
// 插值器
typedef agg::span_interpolator_linear<> interpolator_type;
// 变换矩阵
agg::trans_affine img_mtx;
interpolator_type ip(img_mtx);
typedef agg::span_image_filter_rgb_bilinear_clip<agg::pixfmt_rgb24,interpolator_type> span_gen_type;
span_gen_type span_gen(pixf24_src,agg::rgba(1,1,1),ip);
// 组合渲染器
agg::renderer_scanline_aa<
renderer_base_type,
span_allocator_type,
span_gen_type> my_renderer(renb,span_alloc,span_gen);
// 矩阵变换
double xzoom = (double)nWidth / newx;
double yzoom = (double)nHeight / newy;
img_mtx.scale(xzoom,yzoom);
agg::rasterizer_scanline_aa<> rasterizer;
rasterizer.reset();
rasterizer.move_to_d(0,0);
rasterizer.line_to_d(newx,0);
rasterizer.line_to_d(newx,newy);
rasterizer.line_to_d(0,newy);
agg::scanline_u8 sl;
agg::render_scanlines(rasterizer,sl,my_renderer);
}
else if( nBpp == 8 )
{
}
else; // 1bit,4bits不进行处理
if( pDest != NULL )
{
pDest->Transfer( temp );
}
else this->Transfer( temp );
return true;
}
CxImage cx_Image;
cx_Image.Load("d:\\123.bmp",false);
CxImage cx_Image;