From ceec61fe9614b7fb631781c3f9d21894e084077b Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Thu, 14 Sep 2006 14:01:33 +0200 Subject: implement biliear resampling --- src/GipfelWidget.H | 9 ++++++--- src/GipfelWidget.cxx | 46 ++++++++++++++++++++++++++++++++++++++++++---- src/Stitch.cxx | 2 +- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/src/GipfelWidget.H b/src/GipfelWidget.H index 7bcd3c0..054e9ef 100644 --- a/src/GipfelWidget.H +++ b/src/GipfelWidget.H @@ -48,10 +48,13 @@ class GipfelWidget : public Fl_Widget { int get_rel_track_width(Hill *m); static int get_pixel_nearest(Fl_Image *img, double x, double y, - char *r, char *g, char *b); + uchar *r, uchar *g, uchar *b); + + static int get_pixel_bilinear(Fl_Image *img, double x, double y, + uchar *r, uchar *g, uchar *b); static int get_pixel(Fl_Image *img, int x, int y, - char *r, char *g, char *b); + uchar *r, uchar *g, uchar *b); public: GipfelWidget(int X,int Y,int W, int H); @@ -125,7 +128,7 @@ class GipfelWidget : public Fl_Widget { int update(); int get_pixel(double a_view, double a_nick, - char *r, char *g, char *b); + uchar *r, uchar *g, uchar *b); void draw(); }; diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx index 75451ec..272189c 100644 --- a/src/GipfelWidget.cxx +++ b/src/GipfelWidget.cxx @@ -748,7 +748,7 @@ GipfelWidget::handle(int event) { int GipfelWidget::get_pixel(double a_view, double a_nick, - char *r, char *g, char *b) { + uchar *r, uchar *g, uchar *b) { double px, py; @@ -760,13 +760,13 @@ GipfelWidget::get_pixel(double a_view, double a_nick, return 1; } - return get_pixel_nearest(img, px + ((double) img->w()) / 2.0, + return get_pixel_bilinear(img, px + ((double) img->w()) / 2.0, py + ((double) img->h()) / 2.0, r, g, b); } int GipfelWidget::get_pixel_nearest(Fl_Image *img, double x, double y, - char *r, char *g, char *b) { + uchar *r, uchar *g, uchar *b) { if (isnan(x) || isnan(y)) { return 1; } else { @@ -774,10 +774,48 @@ GipfelWidget::get_pixel_nearest(Fl_Image *img, double x, double y, } } +int +GipfelWidget::get_pixel_bilinear(Fl_Image *img, double x, double y, + uchar *r, uchar *g, uchar *b) { + uchar a_r[4] = {0, 0, 0, 0}; + uchar a_g[4] = {0, 0, 0, 0}; + uchar a_b[4] = {0, 0, 0, 0}; + float v0 , v1; + int fl_x = (int) floor(x); + int fl_y = (int) floor(y); + int i, n; + + i = 0; + n = 0; + for (int iy = 0; iy <= 1; iy++) { + for (int ix = 0; ix <= 1; ix++) { + n += get_pixel(img, fl_x + ix, fl_y + iy, &(a_r[i]), &(a_g[i]), &(a_b[i])); + i++; + } + } + + v0 = a_r[0] * (1 - (x - fl_x)) + a_r[1] * (x - fl_x); + v1 = a_r[2] * (1 - (x - fl_x)) + a_r[3] * (x - fl_x); + *r = (uchar) rint(v0 * (1 - (y - fl_y)) + v1 * (y - fl_y)); + + v0 = a_g[0] * (1 - (x - fl_x)) + a_g[1] * (x - fl_x); + v1 = a_g[2] * (1 - (x - fl_x)) + a_g[3] * (x - fl_x); + *g = (uchar) rint(v0 * (1 - (y - fl_y)) + v1 * (y - fl_y)); + + v0 = a_b[0] * (1 - (x - fl_x)) + a_b[1] * (x - fl_x); + v1 = a_b[2] * (1 - (x - fl_x)) + a_b[3] * (x - fl_x); + *b = (uchar) rint(v0 * (1 - (y - fl_y)) + v1 * (y - fl_y)); + + if (n >= 1) { + return 1; + } else { + return 0; + } +} int GipfelWidget::get_pixel(Fl_Image *img, int x, int y, - char *r, char *g, char *b) { + uchar *r, uchar *g, uchar *b) { if ( img->d() == 0 ) { return 1; } diff --git a/src/Stitch.cxx b/src/Stitch.cxx index af46968..f8f77fb 100644 --- a/src/Stitch.cxx +++ b/src/Stitch.cxx @@ -93,7 +93,7 @@ int Stitch::resample(int w, int h, double view_start, double view_end) { double step_view = (view_end - view_start) / w; - char r, g, b; + uchar r, g, b; int y_off = h / 2; int merged_pixel_set; double radius = (double) w / (view_end -view_start); -- cgit v1.2.3