|Page 1 of 1|
|Author:||kyuusaku [ Sun Sep 16, 2007 5:51 pm ]|
I would like to add interpolation to my programs, but I don't have the background in math necessary to understand the Wikipedia entries on the various methods. Has anyone else like me here found a good website for reference?
Most algorithms also interpolate in 2D when I only want to interpolate 1D scanlines to just approximately achieve the correct pixel aspect ratio. What would be the easiest method for me to implement in this respect?
I know I don't want nearest neighbor, but I think I've come up with an algorithm for it. Could someone confirm this to be correct:
outpixel[i] = inpixel[round(numofpixin/numofpixout*i)]
In the meantime I've come up with a "common sense" algorithm which just weighs pixels against their subpixel "bias" which I split between the previous and next pixels:
scalefactor = numofpixout / numofpixin
(pixelin[((int)(i / scalefactor) - 1) & numofpixin] * ((i / scalefactor) % 1) / 2)) +
(pixelin[(int)(i / scalefactor) ] * (1 - ((i / scalefactor) % 1))) +
(pixelin[((int)(i / scalefactor)+ 1) & numofpixin] * ((i / scalefactor) % 1) / 2))
Anything like conventional linear interpolation?
|Author:||Mednafen [ Tue Sep 18, 2007 3:11 am ]|
A quick-and-dirty example of linear interpolation that works for:
(output_width / input_width) >= 0.5
(There may be a few bugs, at it's untested, but the general concept is good ).
Also, your input pixel buffer should at least have a pitch of (input_width + 1) pixels, and on each line do:
input_line[input_width] = input_line[input_width - 1];
so that the color of the rightmost pixels in the output will be correct.
uint32_t step = (uint32_t)((uint64_t)65536 * input_width / output_width);
uint32_t pos = 0;
for(unsigned int i = 0; i < output_width; i++)
r = pixel[pos >> 16].r * (0x10000 - (pos & 0xFFFF));
r+= pixel[(pos >> 16) + 1].r * (pos & 0xFFFF);
g = pixel[pos >> 16].g * (0x10000 - (pos & 0xFFFF));
g+= pixel[(pos >> 16) + 1].g * (pos & 0xFFFF);
b = pixel[pos >> 16].b * (0x10000 - (pos & 0xFFFF));
b+= pixel[(pos >> 16) + 1].b * (pos & 0xFFFF);
out_pixel[i].r = r >> 16;
out_pixel[i].g = g >> 16;
out_pixel[i].b = b >> 16;
pos += step;
|Page 1 of 1||All times are UTC - 7 hours|
|Powered by phpBB® Forum Software © phpBB Group