Java-Gaming.org
Play Revenge of the Titans! The situation is critical. We need fancy commanders to defend Earth, the moon, Mars!
Featured games (78)
games approved by the League of Dukes
Games in Showcase (407)
games submitted by our members
Games in WIP (293)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1]
  ignore  |  Print  
  Fastest RGB --- bilinear interpolation  (Read 1902 times)
0 Members and 1 Guest are viewing this topic.
Offline DzzD
« Posted 2010-03-16 19:56:28 »

too long time without a Fastest something ! so I decided to share another nice code from 3DzzD Smiley

the following function enable to filter 4 pixels using two interpolation factors to perform fast/perpixel "bicubic bilinear/cubic filtering" of an image

the filtering is based on area covered by pixels based on their interpolation factors, and the result is something that look very similar to bicubic filtering :
 - make pixels appear rounded when zoomed a lot and antialiased when zoomed out
 - you can see such effect in most 3DzzD demo if you get very close of a texture : this enable high quality when texture ar zoomed out (under pixel presicion up to 1/256 with in conjonction with mipmapping enable some kind of 2*2 anisiotropic filtering) and also zoomed in that make pixels blend nice and appear rounded.

NB: for readability it is adapted from the original version wich is a little different

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
/**
 * Perform a bilinear interpolation of 4 RGB/vector each packed in an int as three unsigned bytes 0xXXYYZZ or 0xRRGGBB.<br>
 * <br>
 * can be either RGB color for image bicubic filtering or vector XYZ (only positive)
 *
 * @param c1 value/color 1 (upper left value/RGB pixel)
 * @param c2 value/color 2 (upper right value/RGB pixel)
 * @param c3 value/color 3 (lower left value/RGB pixel)
 * @param c4 value/color 4 (lower right value/RGB pixel)
 * @param bX x interpolation factor (range 0-256)
 * @param bY y interpolation factor (range 0-256)
 *
 * @return interpolated value(packed RGB pixel) of c1,c2,c3,c4 for given factors bX & bY as three packed unsigned bytes
 *
 * @author Bruno Augier http://dzzd.net/
 */


public int interpolate(int c1,int c2,int c3,int c4,int bX, int bY)
{
   int f24=(bX*bY)>>8;
   int f23=bX-f24;
   int f14=bY-f24;
   int f13=((256-bX)*(256-bY))>>8; // this one can be computed faster
 
   return ((((c1&0xFF00FF)*f13+(c2&0xFF00FF)*f23+(c3&0xFF00FF)*f14+(c4&0xFF00FF)*f24)&0xFF00FF00)|
           (((c1&0x00FF00)*f13+(c2&0x00FF00)*f23+(c3&0x00FF00)*f14+(c4&0x00FF00)*f24)&0x00FF0000))>>>8;
}


EDIT: correction missnamed : bilinear/cubic rather than bicubic...

Offline Jono

Senior Member


Medals: 1
Projects: 1



« Reply #1 - Posted 2010-03-16 21:30:41 »

I think that's bilinear rather than bicubic, but still very nice and succinct!
Offline DzzD
« Reply #2 - Posted 2010-03-16 21:45:00 »

hum I dont think so bilinear would compute linear result (ax+b) :
linera between c1/c2 => c12
linear betwwen c3/c4 => c34
and then linear between c12/c34 giving a shape made of lines rather then curves

below (enclosed image) is a cupple of pixels zoomed in (taking from a running apps dont knwo exacly how much but guess approx 5*5 pixel image) with this filtering function (if it was linear it would give a polygne not a curve)

EDIT : hoho... sorry you are right... yes the result is bilinear filering Smiley  "but cubic" as x² sorry

Pages: [1]
  ignore  |  Print  
 
 
You cannot reply to this message, because it is very, very old.

Play Revenge of the Titans! The situation is critical. We need fancy commanders to defend Earth, the moon, Mars!
 
Play Revenge of the Titans! The situation is critical. We need fancy commanders to defend Earth, the moon, Mars and Titan!

Add your game by posting it in the WIP section,
or publish it in Showcase.

The first screenshot will be displayed as a thumbnail.

The invasion has landed! On Mars! And you're there to beat 'em!
cubemaster21 (98 views)
2013-05-17 21:29:12

alaslipknot (106 views)
2013-05-16 21:24:48

gouessej (136 views)
2013-05-16 00:53:38

gouessej (131 views)
2013-05-16 00:17:58

theagentd (143 views)
2013-05-15 15:01:13

theagentd (129 views)
2013-05-15 15:00:54

StreetDoggy (172 views)
2013-05-14 15:56:26

kutucuk (193 views)
2013-05-12 17:10:36

kutucuk (196 views)
2013-05-12 15:36:09

UnluckyDevil (202 views)
2013-05-12 05:09:57
Complex number cookbook
by Roquen
2013-04-24 12:47:31

2D Dynamic Lighting
by Oskuro
2013-04-17 16:46:12

2D Dynamic Lighting
by Oskuro
2013-04-17 16:45:57

2D Dynamic Lighting
by Oskuro
2013-04-17 16:23:20

Noise (bandpassed white)
by Roquen
2013-04-05 17:36:01

Noise (bandpassed white)
by Roquen
2013-04-03 16:17:38

Java Data structures
by Roquen
2013-03-29 13:21:12

Topic Request
by kutucuk
2013-03-22 21:42:01
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!
Page created in 0.073 seconds with 20 queries.