图片顺时针旋转90度的算法

 最近在开发过程中遇到一个问题,手机屏幕是240*320,但拍摄的照片是320*240的,所以正常情况下,图片是不能全屏显示的,要么失真,要么就中间部分区域显示,感觉很不爽。而且,网上有好多320*240的图片,很好看,下载到手机上显示不出来原来的效果,很郁闷,既然屏是240*320的,为什么320*240的图片不能全屏显示呢,其实,只要横过来画图就可以了,依此想法,设计了一个算法,其实就是buffer里的数据旋转存放,将其值改为240*320的存储方式,这样问题就迎刃而解了,我现在公布算法程序,抛砖引玉,希望大虾们多多支持。

附上程序:

图片顺时针旋转90度的算法

/*************************************************************************
* Function name: lct_deasil_rotate_bitmap_bits_90_degrees
* Author: 豪情飞翔 Version: 1.0 Date: 2007-11-16
* Description:
* 1. 函数实现图片位图数据旋转的功能, 顺时针旋转90 度
* 2. 转换后的数据保存在 rotate_result 指向的空间
* Input:
* 1. UINT8* rotate_result 转换后的数据存放指针
* 2. UINT8* rotate_original 转换前的数据存放指针
* 3. UINT8 u8BytesPerPixel 每个像素所占用的字节数,即位值除以8
* 4. UINT32 u32Original_width 原始图片的宽度
* 5. UINT32 u32Original_height 原始图片的高度
* return: SINT32
**************************************************************************/
SINT32 lct_deasil_rotate_bitmap_bits_90_degrees( UINT8* rotate_result,
UINT8* rotate_original,
UINT8 u8BytesPerPixel,
UINT32 u32Original_width,
UINT32 u32Original_height )
{
int i;
int j;
int k;
int nWidth = u32Original_height;
int nlength_original_height;
int nlength_original_width;

nlength_original_height = u32Original_height * u8BytesPerPixel;
nlength_original_width = u32Original_width * u8BytesPerPixel;

for( i=0; i<u32Original_width; i++ )
{
for( j=0; j<u32Original_height; j++ )
{
for( k=0; k<u8BytesPerPixel; k++ )
{
memcpy( (void*)(rotate_result + i*nlength_original_height + j*2 + k ),
(void*)(rotate_original + (nWidth-1-j)*nlength_original_width + i*2 + k ),
1 );
}
}
}

return 0;
}

参考应用程序

/*************************************************************************
* Function name: lct_convert_bitmap_to_240_320
* Author: 豪情飞翔 Version: 1.0 Date: 2007-11-16
* Description:
* 1. 函数功能实现将320*240 的图片旋转为240*320 的图片
* 2.
* Input:
* 1. PBITMAP bitmap_320_240 输入/ 输出参数, 保存转换后的数据
* return: SINT32
**************************************************************************/
SINT32 lct_convert_bitmap_to_240_320( PBITMAP bitmap_320_240 )
{
UINT8* bits_240_320 = NULL;
if ( bitmap_320_240->bmBytesPerPixel < 0 || bitmap_320_240->bmBytesPerPixel > 4 )
{
return -1;
}
if( !((bitmap_320_240->bmHeight == 240)&&(bitmap_320_240->bmWidth == 320)) )
{
return -1;
}

bits_240_320 = (UINT8*)malloc( 320 *240 * bitmap_320_240->bmBytesPerPixel );
if( NULL == bits_240_320 )
{
return -1;
}

lct_deasil_rotate_bitmap_bits_90_degrees( bits_240_320,
bitmap_320_240->bmBits,
bitmap_320_240->bmBytesPerPixel,
bitmap_320_240->bmWidth,
bitmap_320_240->bmHeight );

free( bitmap_320_240->bmBits );

bitmap_320_240->bmBits = bits_240_320;
bitmap_320_240->bmHeight = 320;
bitmap_320_240->bmWidth = 240;

//bmpitch 的含义是一个扫描行的字节数
bitmap_320_240->bmPitch = bitmap_320_240->bmWidth * bitmap_320_240->bmBytesPerPixel;

return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值