Changeset 8115
- Timestamp:
- 06/02/12 11:15:10 (12 months ago)
- Location:
- ImageMagick/branches/ImageMagick-6
- Files:
-
- 3 edited
-
ChangeLog (modified) (1 diff)
-
magick/pixel-private.h (modified) (1 diff)
-
magick/pixel.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
ImageMagick/branches/ImageMagick-6/ChangeLog
r8106 r8115 2 2 * The -set colorspace option sets the colorspace, it does not transform it. 3 3 * Assume grayscale images in the GIF format are linear. 4 * Add Nicolas Robidoux's bicubic interolation method (reference 5 http://www.imagemagick.org/discourse-server/viewtopic.php?f=2&t=21118). 4 6 5 7 2012-05-31 6.7.7-5 Cristy <quetzlzacatenango@image...> -
ImageMagick/branches/ImageMagick-6/magick/pixel-private.h
r8114 r8115 35 35 36 36 /* 37 Reciprocal alpha: clamp overshoot; ensure alpha is not negative or too 38 close to 0; return reciprocal. 37 Reciprocal alpha: clamp to [MagickEpsilon,1], return reciprocal. 39 38 */ 40 39 beta=(alpha > (MagickRealType) 1.0 ? (MagickRealType) 1.0 : alpha); 41 beta=( gamma < (MagickRealType) MagickEpsilon ? (MagickRealType)40 beta=(beta < (MagickRealType) MagickEpsilon ? (MagickRealType) 42 41 MagickEpsilon : beta); 43 42 return((MagickRealType) 1.0/beta); -
ImageMagick/branches/ImageMagick-6/magick/pixel.c
r8111 r8115 3812 3812 } 3813 3813 3814 /*3815 BicubicInterpolate()3816 Interpolate a Cubic Interpolatation of array of 4 'pixels',3817 for given delta_x, and save result into 'pixel'3818 But what 'cubic' is this? It does not match 'catrom' or 'lagrange'3819 */3820 static void BicubicInterpolate(const MagickPixelPacket *pixels,const double dx,3821 MagickPixelPacket *pixel)3822 {3823 MagickRealType3824 dx2,3825 p,3826 q,3827 r,3828 s;3829 3830 dx2=dx*dx;3831 p=(pixels[3].red-pixels[2].red)-(pixels[0].red-pixels[1].red);3832 q=(pixels[0].red-pixels[1].red)-p;3833 r=pixels[2].red-pixels[0].red;3834 s=pixels[1].red;3835 pixel->red=(dx*dx2*p)+(dx2*q)+(dx*r)+s;3836 p=(pixels[3].green-pixels[2].green)-(pixels[0].green-pixels[1].green);3837 q=(pixels[0].green-pixels[1].green)-p;3838 r=pixels[2].green-pixels[0].green;3839 s=pixels[1].green;3840 pixel->green=(dx*dx2*p)+(dx2*q)+(dx*r)+s;3841 p=(pixels[3].blue-pixels[2].blue)-(pixels[0].blue-pixels[1].blue);3842 q=(pixels[0].blue-pixels[1].blue)-p;3843 r=pixels[2].blue-pixels[0].blue;3844 s=pixels[1].blue;3845 pixel->blue=(dx*dx2*p)+(dx2*q)+(dx*r)+s;3846 p=(pixels[3].opacity-pixels[2].opacity)-(pixels[0].opacity-pixels[1].opacity);3847 q=(pixels[0].opacity-pixels[1].opacity)-p;3848 r=pixels[2].opacity-pixels[0].opacity;3849 s=pixels[1].opacity;3850 pixel->opacity=(dx*dx2*p)+(dx2*q)+(dx*r)+s;3851 if (pixel->colorspace == CMYKColorspace)3852 {3853 p=(pixels[3].index-pixels[2].index)-(pixels[0].index-pixels[1].index);3854 q=(pixels[0].index-pixels[1].index)-p;3855 r=pixels[2].index-pixels[0].index;3856 s=pixels[1].index;3857 pixel->index=(dx*dx2*p)+(dx2*q)+(dx*r)+s;3858 }3859 }3860 3861 3814 static inline double MagickMax(const MagickRealType x,const MagickRealType y) 3862 3815 { … … 3937 3890 i=2; /* size of the area to average - average nearest 4 neighbours */ 3938 3891 if (interpolate == Average9InterpolatePixel) 3939 i=3,x_offset=floor(x+0.5)-1,y_offset=floor(y+0.5)-1; 3892 { 3893 i=3; 3894 x_offset=(ssize_t) (floor(x+0.5)-1); 3895 y_offset=(ssize_t) (floor(y+0.5)-1); 3896 } 3940 3897 else if (interpolate == Average16InterpolatePixel) 3941 i=4,x_offset--,y_offset--; 3942 3943 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,i,i,exception); 3898 { 3899 i=4; 3900 x_offset--; 3901 y_offset--; 3902 } 3903 3904 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,(size_t) i, 3905 (size_t) i,exception); 3944 3906 if (p == (const PixelPacket *) NULL) 3945 3907 { … … 3978 3940 case BicubicInterpolatePixel: 3979 3941 { 3980 MagickPixelPacket 3981 u[4]; 3942 MagickRealType 3943 beta[4], 3944 cx[4], 3945 cy[4]; 3982 3946 3983 3947 PointInfo … … 3996 3960 delta.x=x-x_offset; 3997 3961 delta.y=y-y_offset; 3998 for (i=0; i < 4L; i++) 3999 BicubicInterpolate(pixels+4*i,delta.x,u+i); 4000 BicubicInterpolate(u,delta.y,pixel); 3962 beta[0]=1.0-delta.x; 3963 beta[1]=(-0.5)*delta.x; 3964 beta[2]=beta[0]*beta[1]; 3965 cx[0]=beta[0]*beta[2]; 3966 cx[3]=delta.x*beta[2]; 3967 beta[3]=cx[3]-cx[0]; 3968 cx[1]=beta[0]-cx[0]+beta[3]; 3969 cx[2]=delta.x-cx[3]-beta[3]; 3970 beta[0]=1.0-delta.y; 3971 beta[1]=(-0.5)*delta.y; 3972 beta[2]=beta[0]*beta[1]; 3973 cy[0]=beta[0]*beta[2]; 3974 cy[3]=delta.y*beta[2]; 3975 beta[3]=cy[3]-cy[0]; 3976 cy[1]=beta[0]-cy[0]+beta[3]; 3977 cy[2]=delta.y-cy[3]-beta[3]; 3978 /* 3979 Interpolate pixel. 3980 */ 3981 pixel->red=(cy[0]*(cx[0]*pixels[0].red+cx[1]* 3982 pixels[1].red+cx[2]*pixels[2].red+cx[3]* 3983 pixels[3].red)+cy[1]*(cx[0]*pixels[4].red+cx[1]* 3984 pixels[5].red+cx[2]*pixels[6].red+cx[3]* 3985 pixels[7].red)+cy[2]*(cx[0]*pixels[8].red+cx[1]* 3986 pixels[9].red+cx[2]*pixels[10].red+cx[3]* 3987 pixels[11].red)+cy[3]*(cx[0]*pixels[12].red+cx[1]* 3988 pixels[13].red+cx[2]*pixels[14].red+cx[3]*pixels[15].red)); 3989 pixel->green=(cy[0]*(cx[0]*pixels[0].green+cx[1]* 3990 pixels[1].green+cx[2]*pixels[2].green+cx[3]* 3991 pixels[3].green)+cy[1]*(cx[0]*pixels[4].green+cx[1]* 3992 pixels[5].green+cx[2]*pixels[6].green+cx[3]* 3993 pixels[7].green)+cy[2]*(cx[0]*pixels[8].green+cx[1]* 3994 pixels[9].green+cx[2]*pixels[10].green+cx[3]* 3995 pixels[11].green)+cy[3]*(cx[0]*pixels[12].green+cx[1]* 3996 pixels[13].green+cx[2]*pixels[14].green+cx[3]*pixels[15].green)); 3997 pixel->blue=(cy[0]*(cx[0]*pixels[0].blue+cx[1]* 3998 pixels[1].blue+cx[2]*pixels[2].blue+cx[3]* 3999 pixels[3].blue)+cy[1]*(cx[0]*pixels[4].blue+cx[1]* 4000 pixels[5].blue+cx[2]*pixels[6].blue+cx[3]* 4001 pixels[7].blue)+cy[2]*(cx[0]*pixels[8].blue+cx[1]* 4002 pixels[9].blue+cx[2]*pixels[10].blue+cx[3]* 4003 pixels[11].blue)+cy[3]*(cx[0]*pixels[12].blue+cx[1]* 4004 pixels[13].blue+cx[2]*pixels[14].blue+cx[3]*pixels[15].blue)); 4005 pixel->opacity=(cy[0]*(cx[0]*pixels[0].opacity+cx[1]* 4006 pixels[1].opacity+cx[2]*pixels[2].opacity+cx[3]* 4007 pixels[3].opacity)+cy[1]*(cx[0]*pixels[4].opacity+cx[1]* 4008 pixels[5].opacity+cx[2]*pixels[6].opacity+cx[3]* 4009 pixels[7].opacity)+cy[2]*(cx[0]*pixels[8].opacity+cx[1]* 4010 pixels[9].opacity+cx[2]*pixels[10].opacity+cx[3]* 4011 pixels[11].opacity)+cy[3]*(cx[0]*pixels[12].opacity+cx[1]* 4012 pixels[13].opacity+cx[2]*pixels[14].opacity+cx[3]*pixels[15].opacity)); 4001 4013 break; 4002 4014 } … … 4085 4097 gamma = 1.0/gamma; 4086 4098 alpha[0]=1.0/(fabs((double) alpha[0]) < MagickEpsilon ? MagickEpsilon : alpha[0]); 4087 pixel->red = alpha[0]*pixel s->red;4088 pixel->green = alpha[0]*pixel s->green; /* divide by sum of alpha */4089 pixel->blue = alpha[0]*pixel s->blue;4090 pixel->index = alpha[0]*pixel s->index;4091 pixel->opacity = gamma*pixel s->opacity; /* divide by number of pixels */4099 pixel->red = alpha[0]*pixel->red; 4100 pixel->green = alpha[0]*pixel->green; /* divide by sum of alpha */ 4101 pixel->blue = alpha[0]*pixel->blue; 4102 pixel->index = alpha[0]*pixel->index; 4103 pixel->opacity = gamma*pixel->opacity; /* divide by number of pixels */ 4092 4104 break; 4093 4105 }
Note: See TracChangeset
for help on using the changeset viewer.
