使用斯凯平台图片缩放函数注意的地方

来源:互联网 发布:日本软件企业排名 编辑:程序博客网 时间:2024/04/28 13:06

 

//////////////////////////////////////////////////////////////////////////////////////////////////////

//sky-mobi 提供的图片显示接口

//////////////////////////////////////////////////////////////////////////////////////////////////////

/*

将mrp中名为filename的图片,从(x, y)开始的宽高为w, h的区域,

加载到序号为i的bmp缓冲中。max_w为名为filename的图片的图

片宽度。

 

mythroad中共有30个图片缓冲(序号0~29),可以将mrp中的bmp图片

加载到缓冲中,供后继的绘图等操作

 

当满足(x==0)&&(y==0)&&(w==max_w)条件时,mrc_bitmapLoad将导入整幅

图片,而不是一部分。

 

输入:

i                  图片缓冲序号

filename      文件名,当文件名为"*"时,释放该缓存

x,y              源图片的起始位置

w,h             欲加载图片的宽高

max_w        欲加载图片的原始宽度

 

返回:

      MR_SUCCESS     成功

      MR_FAILED         失败

*/

int32 mrc_bitmapLoad(uint16 i, char* filename, int16 x, int16 y, uint16 w, uint16 h, uint16 max_w);

 

/*

将序号为i的bmp缓冲中的图片,从缓冲中的图片的(sx, sy)

开始的宽高为w, h的区域,绘制到(x, y)开始的屏幕缓冲中。

 

输入:

i                  图片缓冲序号

x,y              屏幕位置

rop              选择如下:

   BM_OR,         //SRC .OR. DST*   半透明效果

   BM_XOR,        //SRC .XOR. DST*

   BM_COPY,       //DST = SRC*      覆盖

   BM_NOT,        //DST = (!SRC)*

   BM_MERGENOT,   //DST .OR. (!SRC)

   BM_ANDNOT,     //DST .AND. (!SRC)

   BM_TRANSPARENT,//透明色不显示,图片的第一个象素(左上角

                                 的象素)是透明色

   BM_AND,        //DST AND SRC

   BM_GRAY,        //灰度绘图, 相当于BM_TRANSPARENT+灰度绘图:

                              DST灰度 = 30%R + 59%G + 11%B图片序号

   BM_REVERSE     //反向绘图,相当于BM_TRANSPARENT+反向绘图(V1939)

 

sx,sy              源图片的起始位置

w,h             欲加载图片的宽高

 

返回:

      MR_SUCCESS     成功

      MR_FAILED         失败

*/

int32 mrc_bitmapShow(uint16 i, int16 x, int16 y, uint16 rop, int16 sx, int16 sy, int16 w, int16 h);

 

/*

用增强的方式将bmp图片绘制于指定图片中。

将序号si 的bmp缓冲中的图片,从缓冲中的图片的(sx, sy)开

始的宽高为w, h的区域,绘制到序号di 的从(dx,dy)开始的bmp

缓冲中。

 

模式rop选择如下:

   BM_COPY,               //DST = SRC*      覆盖

   BM_TRANSPARENT,  //透明色不显示,图片的第一个象素(左上

                                  角的象素)是透明色

 

A、B、C、D用于图像变化,用于该变化的变换矩阵为:

x = A0*x0 + B0*y0

y = C0*x0 + D0*y0

这里为了表示小数,A, B, C, D均被乘以了256,即:

A = A0*256

B = B0*256

C = C0*256

D = D0*256

根据变换公式,可以绘出不同效果的图像,比如:

旋转图像:

A = 256 * cos(角度)

B = 256 * sin(角度)

C = 256 * -sin(角度)

D = 256 * cos(角度)

放大、缩小图像:

A = 256 * 放大倍数

B = 0

C = 0

D = 256 * 放大倍数

 

返回:

      MR_SUCCESS     成功

      MR_FAILED         失败

*/

int mrc_bitmapDraw(

   uint16 di,

   int16 dx,

   int16 dy,

   uint16 si,

   int16 sx,

   int16 sy,

   uint16 w,

   uint16 h,

   int16 A,

   int16 B,

   int16 C,

   int16 D,

   uint16 rop

);

 

 

//////////////////////////////////////////////////////////////////////////////////////////////////////

//可能出问题的代码,原来的资源未释放得情况下申请新的资源空间可能会因为内存的不足导致加载失败

//////////////////////////////////////////////////////////////////////////////////////////////////////

//扩大图片

//返回值:0   失败

// 1     成功

int zx_draw_bmp_enlarge(char* bmp_name, //图片名称

uint16 old_width, //原来的宽度

uint16 old_height, //原来的高度

uint16 multiple1, //扩大的倍数

uint16 multiple2, //扩大的倍数

int16 new_x, //扩大后显示的位置

int16 new_y,

int16 is_upside, //是否倒置,非0倒置,0不倒置

uint16 style) //显示的方式

{

uint16 old_index = 3;

uint16 index = 4;

int32 ret= MR_FAILED;

uint16 A,D;

 

A = (int16)256*multiple1/10000*multiple2/10000;//164;

D = A;

ret = mrc_bitmapLoad(old_index, bmp_name, 0, 0, old_width, old_height, old_width);

if (MR_SUCCESS != ret)

{

return 0;

}

ret= MR_FAILED;

ret = mrc_bitmapNew((int16)index, (uint16)(old_width), (uint16)(old_height));

if (MR_SUCCESS != ret)

{

mrc_bitmapLoad(old_index, "*", 0, 0, old_width, old_height, old_width);

return 0;

}

 

if (0 == is_upside)

{

ret= MR_FAILED;

ret = mrc_bitmapDraw(index, 0, 0, old_index, 0, 0, 

(int16)(old_width), (int16)(old_height), A, 0, 0, D, style);

}

else

{

ret= MR_FAILED;

ret = mrc_bitmapDraw((uint16)index, 0, 0, old_index, 0, 0, 

(int16)(old_width), 

(int16)(old_height),

(int16)-A, 0, 0, (int16)-D, 

(uint16)style);

}

if (MR_SUCCESS != ret)

{

mrc_bitmapLoad(old_index, "*", 0, 0, old_width, old_height, old_width);

mrc_bitmapLoad(index, "*", 0, 0, old_width, old_height, old_width);

return 0;

}

 

mrc_bitmapShow(index, new_x, new_y, style, 

(int16)(old_width*(10000-multiple1)/10000), //图片缩放积并非整数,为了图片显示完整所以此处需要根据具体大小进行更改一下,高度同此

(int16)(old_height*(10000-multiple2)/10000), 

(int16)(old_width-old_width*(10000-multiple1)/5000),

(int16)(old_height-old_height*(10000-multiple2)/5000));

 

mrc_bitmapLoad(index, "*", 0, 0, old_width, old_height, old_width);

mrc_bitmapLoad(old_index, "*", 0, 0, old_width, old_height, old_width);

return 1;

}

 

//////////////////////////////////////////////////////////////////////////////////////////////////////

//正确的代码

//////////////////////////////////////////////////////////////////////////////////////////////////////

//扩大图片

//返回值:0   失败

// 1     成功

int zx_draw_bmp_enlarge(char* bmp_name, //图片名称

uint16 old_width, //原来的宽度

uint16 old_height, //原来的高度

uint16 multiple1, //扩大的倍数

uint16 multiple2, //扩大的倍数

int16 new_x, //扩大后显示的位置

int16 new_y,

int16 is_upside, //是否倒置,非0倒置,0不倒置

uint16 style) //显示的方式

{

uint16 old_index = 3;

uint16 index = 4;

int32 ret= MR_FAILED;

uint16 A,D;

 

A = (int16)256*multiple1/10000*multiple2/10000;//164;

D = A;

ret = mrc_bitmapLoad(old_index, bmp_name, 0, 0, old_width, old_height, old_width);

if (MR_SUCCESS != ret)

{

return 0;

}

ret= MR_FAILED;

ret = mrc_bitmapNew((int16)index, (uint16)(old_width), (uint16)(old_height));

if (MR_SUCCESS != ret)

{

mrc_bitmapLoad(old_index, "*", 0, 0, old_width, old_height, old_width);

return 0;

}

 

if (0 == is_upside)

{

ret= MR_FAILED;

ret = mrc_bitmapDraw(index, 0, 0, old_index, 0, 0, 

(int16)(old_width), (int16)(old_height), A, 0, 0, D, style);

}

else

{

ret= MR_FAILED;

ret = mrc_bitmapDraw((uint16)index, 0, 0, old_index, 0, 0, 

(int16)(old_width), 

(int16)(old_height),

(int16)-A, 0, 0, (int16)-D, 

(uint16)style);

}

if (MR_SUCCESS != ret)

{

mrc_bitmapLoad(old_index, "*", 0, 0, old_width, old_height, old_width);

mrc_bitmapLoad(index, "*", 0, 0, old_width, old_height, old_width);

return 0;

}

mrc_bitmapLoad(old_index, "*", 0, 0, old_width, old_height, old_width);

mrc_bitmapShow(index, new_x, new_y, style, 

(int16)(old_width*(10000-multiple1)/10000), //图片缩放积并非整数,为了图片显示完整所以此处需要根据具体大小进行更改一下,高度同此

(int16)(old_height*(10000-multiple2)/10000), 

(int16)(old_width-old_width*(10000-multiple1)/5000),

(int16)(old_height-old_height*(10000-multiple2)/5000));

 

mrc_bitmapLoad(index, "*", 0, 0, old_width, old_height, old_width);

 

return 1;

}