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,),