使用斯凯平台图片缩放函数注意的地方
2009-11-13 10:18
190 查看
//////////////////////////////////////////////////////////////////////////////////////////////////////
//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;
}
//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;
}
相关文章推荐
- php in_array 函数使用说明与in_array需要注意的地方说明
- Oracle 使用concat函数需要注意的地方
- 关于Javascript定义函数和this使用的两点注意的地方
- Oracle分析函数model使用时需要注意的几个地方(一)
- Oracle分析函数model使用时需要注意的几个地方(二)
- php in_array 函数使用说明与in_array需要注意的地方说明
- 使用函数模板需要注意的几个地方
- PHP IN_ARRAY 函数使用需要注意的地方
- C语言(5) 函数使用需要注意的地方
- PHP IN_ARRAY 函数 使用需要注意的地方
- 求两数的最公约数的三种方法及gets()函数的使用的一点注意的地方
- C++使用localtime函数需要注意的地方
- C++使用localtime函数需要注意的地方
- PHP IN_ARRAY 函数 使用需要注意的地方
- c 语言中fread()函数使用时应该注意的地方
- PHP图片处理之使用imagecopyresampled函数实现图片缩放例子
- C++使用localtime函数需要注意的地方
- C++使用localtime函数需要注意的地方
- C++使用localtime函数需要注意的地方http://blog.csdn.net/shellching/article/details/8114266
- PHP图片处理之使用imagecopyresampled函数实现图片缩放例子