C语言实现旋转一个HWC的图像

c 复制代码
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

static int rotate_left90(uint8_t *org_img, int height, int width, int channel)
{
	int rval = 0;
	int h = 0, w = 0, c = 0;
	int dst_h = 0, dst_w = 0;
	uint8_t *tmp_img = NULL;

	do {
		tmp_img = (uint8_t *)malloc(height * width * channel * sizeof(uint8_t));
		if (tmp_img == NULL) {
			rval = -1;
			break;
		}
		memcpy(tmp_img, org_img, height * width * channel * sizeof(uint8_t));

		dst_h = width;
		dst_w = height;

		for (h = 0; h < dst_h; h++) {
			for (w = 0; w < dst_w; w++) {
				for (c = 0; c < channel; c++) {
					org_img[h * dst_w *channel + w * channel + c] = \
						tmp_img[w * width *channel + (width - 1 - h) * channel + c];
				}
			}
		}
	} while(0);

	if (tmp_img) {
		free(tmp_img);
		tmp_img = NULL;
	}

	return rval;
}

static int rotate_right90(uint8_t *org_img, int height, int width, int channel)
{
	int rval = 0;
	int h = 0, w = 0, c = 0;
	int dst_h = 0, dst_w = 0;
	uint8_t *tmp_img = NULL;

	do {
		tmp_img = (uint8_t *)malloc(height * width * channel * sizeof(uint8_t));
		if (tmp_img == NULL) {
			rval = -1;
			break;
		}
		memcpy(tmp_img, org_img, height * width * channel * sizeof(uint8_t));

		dst_h = width;
		dst_w = height;

		for (h = 0; h < dst_h; h++) {
			for (w = 0; w < dst_w; w++) {
				for (c = 0; c < channel; c++) {
					org_img[h * dst_w *channel + w * channel + c] = \
						tmp_img[(height - 1 - w) * width * channel + h * channel + c];
				}
			}
		}
	} while(0);

	if (tmp_img) {
		free(tmp_img);
		tmp_img = NULL;
	}

	return rval;
}

static int rotate_right180(uint8_t *org_img, int height, int width, int channel)
{
	int rval = 0;
	int h = 0, w = 0, c = 0;
	int dst_h = 0, dst_w = 0;
	uint8_t *tmp_img = NULL;

	do {
		tmp_img = (uint8_t *)malloc(height * width * channel * sizeof(uint8_t));
		if (tmp_img == NULL) {
			rval = -1;
			break;
		}
		memcpy(tmp_img, org_img, height * width * channel * sizeof(uint8_t));

		dst_h = height;
		dst_w = width;

		for (h = 0; h < dst_h; h++) {
			for (w = 0; w < dst_w; w++) {
				for (c = 0; c < channel; c++) {
					org_img[h * dst_w *channel + w * channel + c] = \
						tmp_img[(dst_h - 1 - h) * dst_w *channel + (dst_w - 1 - w) * channel + c];
				}
			}
		}
	} while(0);

	if (tmp_img) {
		free(tmp_img);
		tmp_img = NULL;
	}

	return rval;
}

static void fill_test_img(uint8_t *test_img, int height, int width, int channel)
{
	int i = 0, j = 0, c = 0;

	for (i = 0; i < height * width * channel; i++) {
		test_img[i] = i;
	}

	for (i = 0; i < height; i++) {
		for (j = 0; j < width; j++) {
			printf("(");
			for (c = 0; c < channel; c++) {
				printf("%d,", test_img[i * width * channel + j * channel + c]);
			}
			printf("), ");
		}
		printf("\n");
	}
}

static void print_result(uint8_t *result_img, int height, int width, int channel)
{
	int i = 0, j = 0, c = 0;

	for (i = 0; i < height; i++) {
		for (j = 0; j < width; j++) {
			printf("(");
			for (c = 0; c < channel; c++) {
				printf("%d,", result_img[i * width * channel + j * channel + c]);
			}
			printf("), ");
		}
		printf("\n");
	}
}

static int test_channel_3(void)
{
	// hwc; for test, h=2, w=3, c=3
	int height = 2;
	int width = 3;
	int channel = 3;
	uint8_t test_img[18];
	int i = 0, j = 0, k = 0;
	int new_w = 0, new_h = 0;
	int ret = 0;

	printf("\n\n=========== start rotate_left90 for channel_3 ===========\n");
	/*
		(0, 1, 2), (3, 4, 5), (6, 7, 8),               (6, 7, 8), (15, 16, 17),
		(9, 10, 11), (12, 13, 14), (15, 16, 17),  ===> (3, 4, 5), (12, 13, 14),
		                                               (0, 1, 2), (9, 10, 11),
	};*/
	fill_test_img(test_img, height, width, channel);
	ret = rotate_left90(test_img, height, width, channel);
	assert(ret == 0);
	printf("After rotate_left90: \n");
	new_w = 2; new_h = 3;
	print_result(test_img, new_h, new_w, channel);


	printf("\n\n=========== start rotate_right90 for channel_3 ===========\n");
	/*
		(0, 1, 2), (3, 4, 5), (6, 7, 8),               (9, 10, 11), (0, 1, 2),
		(9, 10, 11), (12, 13, 14), (15, 16, 17),  ===> (12, 13, 14), (3, 4, 5),
		                                               (15, 16, 17), (6, 7, 8),
	};*/
	fill_test_img(test_img, height, width, channel);
	ret = rotate_right90(test_img, height, width, channel);
	assert(ret == 0);
	printf("After rotate_right90: \n");
	new_w = 2; new_h = 3;
	print_result(test_img, new_h, new_w, channel);

	printf("\n\n=========== start rotate_right180 for channel_3 ===========\n");
	/*
		(0, 1, 2), (3, 4, 5), (6, 7, 8),               (15, 16, 17), (12, 13, 14), (9, 10, 11)
		(9, 10, 11), (12, 13, 14), (15, 16, 17),  ===> (6, 7, 8), (3, 4, 5), (0, 1, 2)
	};*/
	fill_test_img(test_img, height, width, channel);
	ret = rotate_right180(test_img, height, width, channel);
	assert(ret == 0);
	printf("After rotate_right180: \n");
	new_w = 3; new_h = 2;
	print_result(test_img, new_h, new_w, channel);

	return ret;
}

static int test_channel_1(void)
{
	// hwc; for test, h=3, w=4, c=1
	int height = 3;
	int width = 4;
	int channel = 1;
	uint8_t test_img[12];
	int new_w = 0, new_h = 0;
	int ret = 0;

	printf("\n\n=========== start rotate_left90 for channel_1 ===========\n");
	/*
		0, 1, 2,  3,          3, 7, 11
		4, 5, 6,  7,  ===>    2, 6, 10
		8, 9, 10, 11,         1, 5, 9
		                      0, 4, 8
	};*/
	fill_test_img(test_img, height, width, channel);
	ret = rotate_left90(test_img, height, width, channel);
	assert(ret == 0);
	printf("After rotate_left90: \n");
	new_w = 3; new_h = 4;
	print_result(test_img, new_h, new_w, channel);


	printf("\n\n=========== start rotate_right90 for channel_1 ===========\n");
	/*
		0, 1, 2,  3,          8,  4, 0
		4, 5, 6,  7,  ===>    9,  5, 1
		8, 9, 10, 11,         10, 6, 2
		                      11, 7, 3
	};*/
	fill_test_img(test_img, height, width, channel);
	ret = rotate_right90(test_img, height, width, channel);
	assert(ret == 0);
	printf("After rotate_right90: \n");
	new_w = 3; new_h = 4;
	print_result(test_img, new_h, new_w, channel);

	printf("\n\n=========== start rotate_right180 for channel_1 ===========\n");
	/*
		0, 1, 2,  3,          11, 10, 9, 8
		4, 5, 6,  7,  ===>    7, 6, 5, 4
		8, 9, 10, 11,         3, 2, 1, 0
	};*/
	fill_test_img(test_img, height, width, channel);
	ret = rotate_right180(test_img, height, width, channel);
	assert(ret == 0);
	printf("After rotate_right180: \n");
	new_w = 4; new_h = 3;
	print_result(test_img, new_h, new_w, channel);

	return ret;
}

int main()
{
	test_channel_1();

	test_channel_3();

	return 0;
}

结果

c 复制代码
=========== start rotate_left90 for channel_1 ===========
(0,), (1,), (2,), (3,), 
(4,), (5,), (6,), (7,), 
(8,), (9,), (10,), (11,), 
After rotate_left90: 
(3,), (7,), (11,), 
(2,), (6,), (10,), 
(1,), (5,), (9,), 
(0,), (4,), (8,), 


=========== start rotate_right90 for channel_1 ===========
(0,), (1,), (2,), (3,), 
(4,), (5,), (6,), (7,), 
(8,), (9,), (10,), (11,), 
After rotate_right90: 
(8,), (4,), (0,), 
(9,), (5,), (1,), 
(10,), (6,), (2,), 
(11,), (7,), (3,), 


=========== start rotate_right180 for channel_1 ===========
(0,), (1,), (2,), (3,), 
(4,), (5,), (6,), (7,), 
(8,), (9,), (10,), (11,), 
After rotate_right180: 
(11,), (10,), (9,), (8,), 
(7,), (6,), (5,), (4,), 
(3,), (2,), (1,), (0,), 


=========== start rotate_left90 for channel_3 ===========
(0,1,2,), (3,4,5,), (6,7,8,), 
(9,10,11,), (12,13,14,), (15,16,17,), 
After rotate_left90: 
(6,7,8,), (15,16,17,), 
(3,4,5,), (12,13,14,), 
(0,1,2,), (9,10,11,), 


=========== start rotate_right90 for channel_3 ===========
(0,1,2,), (3,4,5,), (6,7,8,), 
(9,10,11,), (12,13,14,), (15,16,17,), 
After rotate_right90: 
(9,10,11,), (0,1,2,), 
(12,13,14,), (3,4,5,), 
(15,16,17,), (6,7,8,), 


=========== start rotate_right180 for channel_3 ===========
(0,1,2,), (3,4,5,), (6,7,8,), 
(9,10,11,), (12,13,14,), (15,16,17,), 
After rotate_right180: 
(15,16,17,), (12,13,14,), (9,10,11,), 
(6,7,8,), (3,4,5,), (0,1,2,), 
相关推荐
91刘仁德8 小时前
C++ 继承和多态 设计模式
c语言·c++·笔记
码行山野赴时序归途8 小时前
链表家族收官篇:循环链表
c语言·开发语言·数据结构·链表
库玛西9 小时前
哈夫曼树与前缀编码:数据压缩的贪心核心
c语言·c++·笔记·考研
雷✘9 小时前
C 语言预处理中的宏展开、条件编译与头文件保护
c语言
aramae9 小时前
模拟实现memset()(C语言)
c语言·开发语言·后端
phltxy10 小时前
C语言结构体
c语言
库玛西10 小时前
数据结构与算法之美:树、森林与二叉树全解析
c语言·数据结构·笔记·考研·算法·学习方法
2601_9555181810 小时前
如何学好C语言:从入门到精通,掌握编程基石
c语言·指针·项目实战·调试技巧·编程基础
是隼人11 小时前
buuctf-pwn ciscn_2019_sw_1(32位只有一次格式化机会)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
点纭11 小时前
C 语言 第七章 常用函数(3)
c语言·开发语言·算法·oracle·c#