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,), 
相关推荐
仟濹1 小时前
【算法 C/C++】二维差分
c语言·c++·算法
亭墨2 小时前
linux0.11内核源码修仙传第五章——内存初始化(主存与缓存)
linux·c语言·驱动开发·学习·缓存·系统架构
愚润求学3 小时前
从零开始学C语言文件操作:理论与代码详解
c语言·开发语言·文件操作·语法
我是大咖3 小时前
c语言笔记 一维数组与二维数组
c语言·笔记·算法
誓约酱3 小时前
(每日一题) 力扣 283 移动零
linux·c语言·数据结构·c++·算法·leetcode
小呀小萝卜儿4 小时前
2025-03-08 学习记录--C/C++-PTA 习题10-2 递归求阶乘和
c语言·学习
腾飞的信仰4 小时前
%d %c %x
c语言·开发语言
weixin_435870785 小时前
C语言经典案例-菜鸟经典案例
c语言·开发语言
秋知叶i6 小时前
【轻松学C:编程小白的大冒险】---变量的定义、声明与应用场景 06
c语言·开发语言
喵帕栞7 小时前
笔记四:C语言中的文件和文件操作
c语言·笔记