怎样实现像photoshop中那样调节图片色调(Hue)??特急!答对立即给分。
怎样实现像photoshop中那样调节图片色调(Hue)??
要求:给出代码。
请高手回答。
答对立即给分。
问题点数:50、回复次数:3Top
1 楼lihao_ningxia(耗子)回复于 2003-08-04 09:29:31 得分 2
WINDOWS提供了很多相关API,你找本关于图形图象的编程方面的书看看,DELPHI这方面的不是很经典,找C++或VC的看看Top
2 楼cnssk(小柯)回复于 2003-08-04 11:05:56 得分 40
C的代码自己看看算法
一个picturebox中的图片,如何在不调用directX的情况下,动态修改图片的HUE值?有
没有什么现成的API?这个功能太常用了,多数图形软件都可以调整色阶的,应该有什
么函数可以设置吧。
shlwapi.h里面有两个函数,ColorRGBToHLS和ColorHLSToRGB,应该可以满足你的要
求,但是要一个点一个点地算,有点慢。
这里还有两个函数,你可以自己想办法提高效率:
*/
#define HLSMAX RANGE /* H,L, and S vary over 0-HLSMAX */
#define RGBMAX 255 /* R,G, and B vary over 0-RGBMAX */
/* HLSMAX BEST IF DIVISIBLE BY 6 */
/* RGBMAX, HLSMAX must each fit in a byte. */
/* Hue is undefined if Saturation is 0 (grey-scale) */
/* This value determines where the Hue scrollbar is */
/* initially set for achromatic colors */
#define UNDEFINED (HLSMAX*2/3)
void RGBtoHLS(DWORD lRGBColor)
{
WORD R,G,B; /* input RGB values */
BYTE cMax,cMin; /* max and min RGB values */
WORD Rdelta,Gdelta,Bdelta; /* intermediate value: % of spread from max
*/
/* get R, G, and B out of DWORD */
R = GetRValue(lRGBColor);
G = GetGValue(lRGBColor);
B = GetBValue(lRGBColor);
/* calculate lightness */
cMax = max( max(R,G), B);
cMin = min( min(R,G), B);
L = ( ((cMax+cMin)*HLSMAX) + RGBMAX )/(2*RGBMAX);
if (cMax == cMin) { /* r=g=b --> achromatic case */
S = 0; /* saturation */
H = UNDEFINED; /* hue */
}
else { /* chromatic case */
/* saturation */
if (L <= (HLSMAX/2))
S = ( ((cMax-cMin)*HLSMAX) + ((cMax+cMin)/2) ) / (cMax+cMin);
else
S = ( ((cMax-cMin)*HLSMAX) + ((2*RGBMAX-cMax-cMin)/2) )
/ (2*RGBMAX-cMax-cMin);
/* hue */
Rdelta = ( ((cMax-R)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin);
Gdelta = ( ((cMax-G)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin);
Bdelta = ( ((cMax-B)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin);
if (R == cMax)
H = Bdelta - Gdelta;
else if (G == cMax)
H = (HLSMAX/3) + Rdelta - Bdelta;
else /* B == cMax */
H = ((2*HLSMAX)/3) + Gdelta - Rdelta;
if (H < 0)
H += HLSMAX;
if (H > HLSMAX)
H -= HLSMAX;
}
}
/* utility routine for HLStoRGB */
WORD HueToRGB(WORD n1, WORD n2, WORD hue)
{
/* range check: note values passed add/subtract thirds of range */
if (hue < 0)
hue += HLSMAX;
if (hue > HLSMAX)
hue -= HLSMAX;
/* return r,g, or b value from this tridrant */
if (hue < (HLSMAX/6))
return ( n1 + (((n2-n1)*hue+(HLSMAX/12))/(HLSMAX/6)) );
if (hue < (HLSMAX/2))
return ( n2 );
if (hue < ((HLSMAX*2)/3))
return ( n1 +
(((n2-n1)*(((HLSMAX*2)/3)-hue)+(HLSMAX/12))/(HLSMAX/6))
);
else
return ( n1 );
}
DWORD HLStoRGB(WORD hue,WORD lum,WORD sat)
{
WORD R,G,B; /* RGB component values */
WORD Magic1,Magic2; /* calculated magic numbers (really!) */
if (sat == 0) { /* achromatic case */
R=G=B=(lum*RGBMAX)/HLSMAX;
if (hue != UNDEFINED) {
/* ERROR */
}
}
else { /* chromatic case */
/* set up magic numbers */
if (lum <= (HLSMAX/2))
Magic2 = (lum*(HLSMAX + sat) + (HLSMAX/2))/HLSMAX;
else
Magic2 = lum + sat - ((lum*sat) + (HLSMAX/2))/HLSMAX;
Magic1 = 2*lum-Magic2;
/* get RGB, change units from HLSMAX to RGBMAX */
R = (HueToRGB(Magic1,Magic2,hue+(HLSMAX/3))*RGBMAX +
(HLSMAX/2))/HLSMAX;
G = (HueToRGB(Magic1,Magic2,hue)*RGBMAX + (HLSMAX/2)) / HLSMAX;
B = (HueToRGB(Magic1,Magic2,hue-(HLSMAX/3))*RGBMAX +
(HLSMAX/2))/HLSMAX;
}
return(RGB(R,G,B));
}
Top
3 楼cnssk(小柯)回复于 2003-08-04 14:41:23 得分 8
procedure RGBtoHSL(R,G,B:Integer;var H,S,L:Integer);
var
Delta : Double;
CMax,CMin : Double;
Red,Green,Blue,Hue,Sat,Lum : Double;
begin
Red := R/255;
Green := G/255;
Blue := B/255;
CMax := Max(Red,Max(Green,Blue));
CMin := Min(Red,Min(Green,Blue));
Lum := (CMax+CMin)/2;
if CMax = CMin then begin
Sat := 0;
Hue := 0;
end
else begin
if Lum < 0.5 then Sat := (CMax-CMin)/(CMax+CMin)
else Sat := (cmax-cmin)/(2-cmax-cmin);
delta := CMax-CMin;
If Red = CMax then Hue := (Green-Blue)/Delta
else if Green = CMax then Hue := 2+(Blue-Red)/Delta
else Hue := 4.0+(Red-Green)/Delta;
Hue := Hue / 6;
If Hue < 0 then Hue := Hue + 1;
end;
H := Round(Hue*360);
S := Round(Sat*100);
L := Round(Lum*100);
end;
Top




