图片顺时针旋转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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 这是一个将二维数组顺时针旋转90算法: 1. 创建一个与原数组同样大小的数组,用来存储旋转后的值。 2. 按照以下方式对每个元素进行旋转: - 原数组中 (i, j) 的元素旋转后放在 (j, N-1-i) 的位置,其中 N 是原数组的大小。 3. 将旋转后的数组赋值回原数组。 代码实现如下: ``` void rotate(int arr[][16], int n) { int rotated[16][16]; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { rotated[j][n-1-i] = arr[i][j]; } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { arr[i][j] = rotated[i][j]; } } } ``` 请注意,此代码只是一个示例,实际应用时可能需要根据实际情况进行修改。 ### 回答2: 将 arr 数组中的值顺时针旋转90算法可以通过先转置再翻转的方法来实现。 首先,我们先来进行转置操作。转置操作即将数组沿主对角线进行交换,即 arr[i][j] 与 arr[j][i] 进行交换。这样可以将数组沿着对角线进行翻转。 接下来,进行翻转操作。翻转操作即将每一行的值进行倒序排列,可以通过首尾元素进行交换来实现。 使用两层循环,第一层循环控制行数 i,第二层循环控制列数 j,具体实现如下: ``` for i in range(16): for j in range(i+1, 16): # 转置操作 arr[i][j], arr[j][i] = arr[j][i], arr[i][j] for i in range(16): for j in range(8): # 翻转操作 arr[i][j], arr[i][15-j] = arr[i][15-j], arr[i][j] ``` 这样,经过转置和翻转操作后,arr 数组中的值就按顺时针方向旋转90了。 ### 回答3: 对于一个16x16的矩阵arr,将其顺时针旋转90算法如下: 1. 首先,我们需要创建一个临时矩阵temp[16][16],用于存储旋转后的结果。 2. 然后,使用两层嵌套的循环遍历原始矩阵arr,假设当前遍历到的位置为arr[i][j], 我们需要将其旋转后放置到temp[j][N-1-i]的位置上,其中N=16为矩阵的大小。 3. 最后,将temp矩阵复制回原始矩阵arr中。 下面是具体的实现代码: ``` int N = 16; int arr[16][16]; // 原始数组 int temp[16][16]; // 临时数组 // 将arr矩阵顺时针旋转90 void rotateMatrix() { // 复制原始数组到临时数组 for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { temp[i][j] = arr[i][j]; } } // 将临时数组旋转90后放回原始数组 for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { arr[j][N-1-i] = temp[i][j]; } } } ``` 通过调用`rotateMatrix()`函数,即可将数组arr顺时针旋转90,并存储回原始数组中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值