pikapython/package/PikaCV/PikaCV_Image.c

196 lines
5.7 KiB
C
Raw Normal View History

#include "PikaCV_Image.h"
#include "PikaCV_common.h"
#include "dataStrs.h"
void PikaCV_Image___init__(PikaObj* self) {
if (NULL != obj_getStruct(self, "image")) {
/* already initialized */
return;
}
/* init */
PikaCV_Image image = {
.format = PikaCV_ImageFormat_Type_Unknown,
.width = 0,
.height = 0,
.size = 0,
};
obj_setStruct(self, "image", image);
PikaCV_Image_setData(self, NULL, 0);
}
uint8_t* _Image_getData(PikaObj* self) {
PikaCV_Image* image = obj_getStruct(self, "image");
if (NULL == image) {
return NULL;
}
return obj_getBytes(self, "_data");
}
PIKA_RES PikaCV_Image_setData(PikaObj* self, uint8_t* data, int size) {
PikaCV_Image* image = obj_getStruct(self, "image");
if (NULL == image) {
return PIKA_RES_ERR_ARG_NO_FOUND;
}
obj_setBytes(self, "_data", data, size);
image->size = size;
return PIKA_RES_OK;
}
Arg* PikaCV_Image_data(PikaObj* self) {
PikaCV_Image* image = obj_getStruct(self, "image");
if (NULL == image) {
return NULL;
}
return arg_copy(obj_getArg(self, "_data"));
}
int PikaCV_Image_format(PikaObj* self) {
PikaCV_Image* image = obj_getStruct(self, "image");
if (NULL == image) {
return PikaCV_ImageFormat_Type_Unknown;
}
return image->format;
}
int PikaCV_Image_hight(PikaObj* self) {
PikaCV_Image* image = obj_getStruct(self, "image");
if (NULL == image) {
return 0;
}
return image->height;
}
void PikaCV_Image_loadJpeg(PikaObj* self, Arg* bytes) {
obj_setArg(self, "_data", bytes);
}
void PikaCV_Image_loadRGB565(PikaObj* self,
uint8_t* bytes,
int height,
int width) {
PikaCV_Image* image = obj_getStruct(self, "image");
if (NULL == image) {
return;
}
image->format = PikaCV_ImageFormat_Type_RGB565;
image->height = height;
image->width = width;
image->size = height * width * 2;
PikaCV_Image_setData(self, bytes, image->size);
}
void PikaCV_Image_loadRGB888(PikaObj* self,
uint8_t* bytes,
int height,
int width) {
PikaCV_Image* image = obj_getStruct(self, "image");
if (NULL == image) {
return;
}
image->format = PikaCV_ImageFormat_Type_RGB888;
image->height = height;
image->width = width;
image->size = height * width * 3;
PikaCV_Image_setData(self, bytes, image->size);
}
void PikaCV_Image_loadGray(PikaObj* self,
uint8_t* bytes,
int height,
int width) {
PikaCV_Image* image = obj_getStruct(self, "image");
if (NULL == image) {
return;
}
image->format = PikaCV_ImageFormat_Type_GRAY;
image->height = height;
image->width = width;
image->size = height * width;
PikaCV_Image_setData(self, bytes, image->size);
}
void PikaCV_Image_read(PikaObj* self, char* path) {
PikaCV_Image* image = obj_getStruct(self, "image");
if (NULL == image) {
return;
}
Arg* data_arg = arg_loadFile(NULL, path);
if (NULL == data_arg) {
return;
}
Args buffs = {0};
char* suffix = strsGetLastToken(&buffs, path, '.');
if (suffix == NULL) {
return;
}
if (strEqu(suffix, "jpg")) {
image->format = PikaCV_ImageFormat_Type_JPEG;
PikaCV_Image_loadJpeg(self, data_arg);
} else {
obj_setErrorCode(self, PIKA_RES_ERR_OPERATION_FAILED);
__platform_printf("PikaCV_Image_read: unsupported format: %s\n",
suffix);
}
arg_deinit(data_arg);
strsDeinit(&buffs);
}
void PikaCV_Image_setPixel(PikaObj* self,
int channel,
int value,
int x,
int y) {
PikaCV_Image* image = obj_getStruct(self, "image");
if (NULL == image) {
return;
}
uint8_t* data = _Image_getData(self);
if (image->format == PikaCV_ImageFormat_Type_RGB565) {
data[(y * image->width + x) * 2 + channel] = value;
} else if (image->format == PikaCV_ImageFormat_Type_RGB888) {
data[(y * image->width + x) * 3 + channel] = value;
} else if (image->format == PikaCV_ImageFormat_Type_GRAY) {
data[y * image->width + x] = value;
} else {
obj_setErrorCode(self, PIKA_RES_ERR_OPERATION_FAILED);
__platform_printf("PikaCV_Image_setPixel: unsupported format: %d\n",
image->format);
}
}
int PikaCV_Image_getPixel(PikaObj* self, int channel, int x, int y) {
PikaCV_Image* image = obj_getStruct(self, "image");
if (NULL == image) {
return 0;
}
uint8_t* data = _Image_getData(self);
if (image->format == PikaCV_ImageFormat_Type_RGB565) {
return data[(y * image->width + x) * 2 + channel];
} else if (image->format == PikaCV_ImageFormat_Type_RGB888) {
return data[(y * image->width + x) * 3 + channel];
} else if (image->format == PikaCV_ImageFormat_Type_GRAY) {
return data[y * image->width + x];
} else {
obj_setErrorCode(self, PIKA_RES_ERR_OPERATION_FAILED);
__platform_printf("PikaCV_Image_getPixel: unsupported format: %d\n",
image->format);
}
return 0;
}
int PikaCV_Image_size(PikaObj* self) {
PikaCV_Image* image = obj_getStruct(self, "image");
if (NULL == image) {
return 0;
}
return image->size;
}
int PikaCV_Image_width(PikaObj* self) {
PikaCV_Image* image = obj_getStruct(self, "image");
if (NULL == image) {
return 0;
}
return image->width;
}