Skip to content

Commit

Permalink
Inserindo conversão entre rgb e bgra
Browse files Browse the repository at this point in the history
  • Loading branch information
anderflash committed Oct 24, 2015
1 parent 22ddf60 commit 7ce03bf
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 38 deletions.
3 changes: 2 additions & 1 deletion include/grafeo/type.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ typedef enum _ColorType{
GRAFEO_LUV,
GRAFEO_LAB,
GRAFEO_BGR,
GRAFEO_RGBA
GRAFEO_RGBA,
GRAFEO_BGRA,
}ColorType;

typedef enum _Adjacency{
Expand Down
92 changes: 55 additions & 37 deletions src/image.c
Original file line number Diff line number Diff line change
Expand Up @@ -293,48 +293,66 @@ void image_write_ppm(Array* array, const char* filename){
Array* image_cvt_color(Array* array, ColorType origin, ColorType destiny){
Array* output;
uint64_t i;

// Creating output array
output = array;
if(origin == GRAFEO_GRAY && destiny == GRAFEO_RGB){
if(destiny == GRAFEO_RGB || destiny == GRAFEO_BGR)
output = array_new_3D_type(array->size[0], array->size[1], 3, array->type);
for(i = 0; i < array->num_elements; i++){
output->data_uint8[3*i ] = array->data_uint8[i];
output->data_uint8[3*i+1] = array->data_uint8[i];
output->data_uint8[3*i+2] = array->data_uint8[i];
}
}else if(origin == GRAFEO_RGB && destiny == GRAFEO_GRAY){
else if(destiny == GRAFEO_GRAY)
output = array_new_2D_type(array->size[0], array->size[1], array->type);
for(i = 0; i < output->num_elements; i++){
output->data_uint8[i] = (uint8_t)(
0.299*(double)array->data_uint8[3*i ] +
0.587*(double)array->data_uint8[3*i+1] +
0.114*(double)array->data_uint8[3*i+2]);
}
}else if(origin == GRAFEO_RGB && destiny == GRAFEO_BGR){
output = array_copy(array);
uint64_t size_gray = output->num_elements/3;
uint8_t tmp;
for(i = 0; i < size_gray; i++){
tmp = output->data_uint8[3*i];
output->data_uint8[3*i] = output->data_uint8[3*i+2];
output->data_uint8[3*i+2] = tmp;
}
}
else if(origin == GRAFEO_GRAY && destiny == GRAFEO_RGBA){
else if(destiny == GRAFEO_RGBA || destiny == GRAFEO_BGRA)
output = array_new_3D_type(array->size[0], array->size[1], 4, array->type);
for(i = 0; i < array->num_elements; i++){
output->data_uint8[4*i ] = array->data_uint8[i];
output->data_uint8[4*i+1] = array->data_uint8[i];
output->data_uint8[4*i+2] = array->data_uint8[i];
output->data_uint8[4*i+3] = 255;


// Filling array
if(origin == GRAFEO_GRAY){
if(destiny == GRAFEO_RGB){
for(i = 0; i < array->num_elements; i++){
output->data_uint8[3*i ] = array->data_uint8[i];
output->data_uint8[3*i+1] = array->data_uint8[i];
output->data_uint8[3*i+2] = array->data_uint8[i];
}
}else if(destiny == GRAFEO_RGBA){
uint64_t i2;
for(i = 0,i2 = 0; i < array->num_elements; i++,i2 = i << 2){
output->data_uint8[i2 ] = array->data_uint8[i];
output->data_uint8[i2+1] = array->data_uint8[i];
output->data_uint8[i2+2] = array->data_uint8[i];
output->data_uint8[i2+3] = 255;
}
}
}else if(origin == GRAFEO_RGB && destiny == GRAFEO_RGBA){
output = array_new_3D_type(array->size[0], array->size[1], 4, array->type);
uint64_t size_gray = array->num_elements/3;
for(i = 0; i < size_gray; i++){
output->data_uint8[4*i ] = array->data_uint8[3*i];
output->data_uint8[4*i+1] = array->data_uint8[3*i+1];
output->data_uint8[4*i+2] = array->data_uint8[3*i+2];
output->data_uint8[4*i+3] = 255;
}else if(origin == GRAFEO_RGB){
if(destiny == GRAFEO_GRAY){
for(i = 0; i < output->num_elements; i++){
output->data_uint8[i] = (uint8_t)(
0.299*(double)array->data_uint8[3*i ] +
0.587*(double)array->data_uint8[3*i+1] +
0.114*(double)array->data_uint8[3*i+2]);
}
}else if(destiny == GRAFEO_BGR){
uint64_t size_gray = output->num_elements/3;
for(i = 0; i < size_gray; i++){
output->data_uint8[3*i ] = array->data_uint8[3*i+2];
output->data_uint8[3*i+1] = array->data_uint8[3*i+1];
output->data_uint8[3*i+2] = array->data_uint8[3*i ];
}
}else if(destiny == GRAFEO_RGBA){
uint64_t size_gray = array->num_elements/3;
for(i = 0; i < size_gray; i++){
output->data_uint8[4*i ] = array->data_uint8[3*i];
output->data_uint8[4*i+1] = array->data_uint8[3*i+1];
output->data_uint8[4*i+2] = array->data_uint8[3*i+2];
output->data_uint8[4*i+3] = 255;
}
}
else if(destiny == GRAFEO_BGRA){
uint64_t size_gray = array->num_elements/3, i2, i3;
for(i = 0, i2 = 0, i3 = 0; i < size_gray; i++, i2 = i << 2, i3 = (i<<1)+i){
output->data_uint8[i2 ] = array->data_uint8[i3+2];
output->data_uint8[i2+1] = array->data_uint8[i3+1];
output->data_uint8[i2+2] = array->data_uint8[i3];
output->data_uint8[i2+3] = 255;
}
}
}
return output;
Expand Down
17 changes: 17 additions & 0 deletions tests/test_image.c
Original file line number Diff line number Diff line change
Expand Up @@ -294,10 +294,27 @@ static void test_image_cvt_color(void** state){
assert_int_equal(array_rgba2->data_uint8[i*4+3],255);
}

// From RGB to BGRA
Array* array_bgra = image_cvt_color(array_rgb, GRAFEO_RGB, GRAFEO_BGRA);
assert_int_equal(array_bgra->dim, 3);
assert_int_equal(array_bgra->size[0] , array_rgb->size[0]);
assert_int_equal(array_bgra->size[1] , array_rgb->size[1]);
assert_int_equal(array_bgra->size[2] , 4);
assert_int_equal(array_bgra->bitsize , array_rgb->bitsize);
assert_int_equal(array_bgra->contiguous , array_rgb->contiguous);
assert_int_equal(array_bgra->num_elements , array_rgb->num_elements*4/3);
for(i = 0; i < array->num_elements;i++){
assert_int_equal(array_bgra->data_uint8[i*4] ,array_rgb->data_uint8[3*i+2]);
assert_int_equal(array_bgra->data_uint8[i*4+1],array_rgb->data_uint8[3*i+1]);
assert_int_equal(array_bgra->data_uint8[i*4+2],array_rgb->data_uint8[3*i]);
assert_int_equal(array_bgra->data_uint8[i*4+3],255);
}

array_free(array_gray);
array_free(array_rgb);
array_free(array_rgba);
array_free(array_rgba2);
array_free(array_bgra);
array_free(array);
}

Expand Down

0 comments on commit 7ce03bf

Please sign in to comment.