41 #define DEFAULT_ALIGNMENT_U8X3 192 52 if ((stride % alignment) != 0)
53 stride += alignment - (stride % alignment);
55 uint8_t *buf = calloc(height*stride,
sizeof(uint8_t));
58 image_u8x3_t tmp = { .
width = width, .height = height, .stride = stride, .buf = buf };
67 uint8_t *buf = malloc(in->
height*in->
stride*
sizeof(uint8_t));
103 for (
int y = 0; y < im->
height; y++) {
104 for (
int x = 0; x < im->
width; x++) {
105 uint8_t gray = pnm->
buf[y*im->
width + x];
118 for (
int y = 0; y < im->
height; y++) {
119 for (
int x = 0; x < im->
width; x++) {
120 uint8_t r = pnm->
buf[y*im->
width*3 + 3*x];
121 uint8_t g = pnm->
buf[y*im->
width*3 + 3*x+1];
122 uint8_t b = pnm->
buf[y*im->
width*3 + 3*x+2];
140 FILE *f = fopen(path,
"wb");
149 fprintf(f,
"P6\n%d %d\n255\n", im->
width, im->
height);
150 int linesz = im->
width * 3;
151 for (
int y = 0; y < im->
height; y++) {
152 if (linesz != fwrite(&im->
buf[y*im->
stride], 1, linesz, f)) {
168 double dist = sqrtf((y1-y0)*(y1-y0) + (x1-x0)*(x1-x0));
169 double delta = 0.5 / dist;
172 for (
float f = 0; f <= 1; f += delta) {
173 int x = ((int) (x1 + (x0 - x1) * f));
174 int y = ((int) (y1 + (y0 - y1) * f));
176 if (x < 0 || y < 0 || x >= im->
width || y >= im->
height)
179 int idx = y*im->
stride + 3*x;
180 for (
int i = 0; i < 3; i++)
181 im->
buf[idx + i] = rgb[i];
185 static void convolve(
const uint8_t *x, uint8_t *y,
int sz,
const uint8_t *k,
int ksz)
189 for (
int i = 0; i < ksz/2 && i < sz; i++)
192 for (
int i = 0; i < sz - ksz; i++) {
195 for (
int j = 0; j < ksz; j++)
198 y[ksz/2 + i] = acc >> 8;
201 for (
int i = sz - ksz + ksz/2; i < sz; i++)
210 assert((ksz & 1) == 1);
213 double *dk = malloc(
sizeof(
double)*ksz);
217 for (
int i = 0; i < ksz; i++) {
219 double v = exp(-.5*
sq(x / sigma));
225 for (
int i = 0; i < ksz; i++)
228 for (
int i = 0; i < ksz; i++)
231 uint8_t *k = malloc(
sizeof(uint8_t)*ksz);
232 for (
int i = 0; i < ksz; i++)
236 for (
int i = 0; i < ksz; i++)
237 printf(
"%d %15f %5d\n", i, dk[i], k[i]);
241 for (
int c = 0; c < 3; c++) {
242 for (
int y = 0; y < im->
height; y++) {
244 uint8_t *in = malloc(
sizeof(uint8_t)*im->
stride);
245 uint8_t *out = malloc(
sizeof(uint8_t)*im->
stride);
247 for (
int x = 0; x < im->
width; x++)
248 in[x] = im->
buf[y*im->
stride + 3 * x + c];
253 for (
int x = 0; x < im->
width; x++)
254 im->
buf[y*im->
stride + 3 * x + c] = out[x];
258 for (
int x = 0; x < im->
width; x++) {
259 uint8_t *in = malloc(
sizeof(uint8_t)*im->
height);
260 uint8_t *out = malloc(
sizeof(uint8_t)*im->
height);
262 for (
int y = 0; y < im->
height; y++)
268 for (
int y = 0; y < im->
height; y++)
269 im->
buf[y*im->
stride + 3*x + c] = out[y];
static void convolve(const uint8_t *x, uint8_t *y, int sz, const uint8_t *k, int ksz)
int image_u8x3_write_pnm(const image_u8x3_t *im, const char *path)
image_u8x3_t * image_u8x3_create_alignment(unsigned int width, unsigned int height, unsigned int alignment)
image_u8x3_t * image_u8x3_create(unsigned int width, unsigned int height)
static double sq(double v)
void image_u8x3_gaussian_blur(image_u8x3_t *im, double sigma, int ksz)
void image_u8x3_draw_line(image_u8x3_t *im, float x0, float y0, float x1, float y1, uint8_t rgb[3], int width)
#define DEFAULT_ALIGNMENT_U8X3
pnm_t * pnm_create_from_file(const char *path)
image_u8x3_t * image_u8x3_copy(const image_u8x3_t *in)
image_u8x3_t * image_u8x3_create_from_pnm(const char *path)
void image_u8x3_destroy(image_u8x3_t *im)
void pnm_destroy(pnm_t *pnm)