做2D游戏时应该用得到,将图形水平翻转,尤其是人物素材,可将本来朝向右边的翻转成朝向左边的。
#include <string.h> int flip_horizontal( int img_width, int img_hight, unsigned char *in_red,//传入的红色 unsigned char *in_green,//传入的绿色 unsigned char *in_blue,//传入的蓝色 unsigned char *in_alpha//传入的透明度 ) //水平翻转图像 { int x,y,pos,temp; unsigned char *out_red;//传出的红色 unsigned char *out_green;//传出的绿色 unsigned char *out_blue;//传出的蓝色 unsigned char *out_alpha;//传出的透明度 out_red = (unsigned char*)malloc(img_width*img_hight);//申请内存 out_green = (unsigned char*)malloc(img_width*img_hight); out_blue = (unsigned char*)malloc(img_width*img_hight); out_alpha = (unsigned char*)malloc(img_width*img_hight); temp = 0; for (y=0;y<img_hight;y++) {//y的初始值为0,小于图片的高度,y自增 //y表示的是图片第几行 pos = y*img_width + img_width-1; for (x=0;x<img_width;x++) { out_red[pos] = in_red[temp]; out_green[pos] = in_green[temp]; out_blue[pos] = in_blue[temp]; out_alpha[pos] = in_alpha[temp]; ++temp; --pos; //假设img_width = 10,当y=0时,那么,out_red[9] = in_red[0],以此类推 //当y=1时,out_red[19] = in_red[10],以此类推 //把图片的每一行水平翻转 } } memcpy(in_red,out_red,img_width*img_hight);//拷贝 memcpy(in_green,out_green,img_width*img_hight); memcpy(in_blue,out_blue,img_width*img_hight); memcpy(in_alpha,out_alpha,img_width*img_hight); free(out_red); free(out_blue);//释放内存 free(out_green); free(out_alpha); return 0; }
上面的是最初写的代码,现在想了一下,没必要申请内存存储翻转后的图形数组,直接左右交换就可以了,类似下面的代码:
int main() { int x,y,pos, left, temp,count; int width = 10, height = 1; unsigned char buff; char str[] = {'0','1', '2', '3', '4', '5', '6', '7', '8', '9',0}; temp = width/2; puts(str); for (y = 0; y < height; ++y) { /* 水平翻转其实也就是交换两边的数据 */ pos = y * width; left = pos; for (x = 0; x <= temp; ++x) { count = left + width - x - 1; buff = str[pos]; str[pos] = str[count]; str[count] = buff; ++pos; } } puts(str); return 0; }