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,), 
相关推荐
梁下轻语的秋缘9 小时前
每日c/c++题 备战蓝桥杯(P1204 [USACO1.2] 挤牛奶 Milking Cows)
c语言·c++·蓝桥杯
零K沁雪9 小时前
Linux C 优雅的执行命令
linux·c语言
tiandyoin14 小时前
统计C盘各种扩展名文件大小总和及数量的PowerShell脚本
java·c语言·spring
序属秋秋秋18 小时前
《C++初阶之入门基础》【C++的前世今生】
c语言·开发语言·c++·笔记·学习·程序人生
超人小子19 小时前
c++之字符串
java·c语言·c++
在右ZR19 小时前
嵌入式(C语言篇)Day13
c语言
iCxhust21 小时前
8088 单板机 汇编 NMI 中断程序示例 (脱离 DOS 环境)
c语言·开发语言·汇编·单片机·嵌入式硬件·mcu
小老鼠不吃猫1 天前
C接口 中文字符问题
c语言·开发语言
Christophe Chen1 天前
strcat及其模拟实现
c语言·算法
xtmatao2 天前
WIN11+VSCODE搭建c/c++开发环境
c语言·c++·vscode