рд╕реБрдВрджрд░ рд╡рд┐рдХрд▓рд╛рдВрдЧ рдЫреЛрдЯреЗ рд░рдХреНрдд рдкреНрд░рддреАрдХ

рдбреЗрд▓реНрдлреА рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рд┐рджреНрдз рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рдЖрдЗрдХрди рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:



рдФрд░ рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╡реЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдВ:



рд╣рдо рдЗрд╕ рддрдереНрдп рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрд▓реНрдлреА рдЖрдкрдХреЛ рдЫрд╡рд┐рдпреЛрдВ рдХреА рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реВрдЪреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реБрдП, рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдЕрдХреНрд╖рдо рдЖрдЗрдХрди рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рд░ рдмрд╛рд░ рдРрд╕реЗ рдЖрдЗрдХреЙрди рдХреЛ рдЦреАрдВрдЪрдирд╛ рдФрд░ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдердХрд╛рдК рдХрд╛рдо рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреА рдЗрд╕ рд╕реВрдЪреА рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдПрдВрдЧреЗред

рд╣рдо рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди CreateSpecialImageList () рдореЗрдВ рдЫрд╡рд┐рдпреЛрдВ рдХреА рдПрдХ рдРрд╕реА рд╕реВрдЪреА рдмрдирд╛рдПрдВрдЧреЗред рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдореЗрдВ рдореВрд▓ рдЖрдЗрдХрдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реВрдЪреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА TImageList рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд┐рд░ рдХреЛрдб рдХреА рдирд┐рдореНрди рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдлреЙрд░реНрдо рдмрдирд╛рддреЗ рд╕рдордп рд╣рдо рдЕрдкрдиреЗ рдирдП рдЖрдЗрдХрди рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

ActionManager.DisabledImages := CreateSpecialImageList(ImageList); 


рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЧрд╣рд░рд╛рдИ рддрдХ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ...



рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рди рдХреЗрд╡рд▓ рдЧреНрд░реЗ рдкрд╛рд░рднрд╛рд╕реА рдЖрдЗрдХрди рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рдмрд▓реНрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЙрдЬреНрдЬрд╡рд▓ рдпрд╛ рдЕрдзрд┐рдХ рд╡рд┐рдкрд░реАрдд рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред HotImages рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдЗрдХрди рдмрдирд╛рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рд╡рд┐рд╢реЗрд╖ рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдкреНрд░рддреАрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдХрд╛рд░реНрдп рд╣реЛрдЧрд╛ред

рд╕реНрд░реЛрдд рдХреЛрдб:

 function CreateSpecialImageList(ASource: TCustomImageList; ABrightness, AContrast, AGrayscale, AAlpha: Single): TCustomImageList; type PBGRA = ^TBGRA; TBGRA = packed record B, G, R, A: Byte; end; TByteLUT = array [Byte] of Byte; function ByteRound(const Value: Single): Byte; inline; begin if Value < 0 then Result := 0 else if Value > 255 then Result := 255 else Result := Round(Value); end; procedure GetLinearLUT(var LUT: TByteLUT; X1, Y1, X2, Y2: Integer); var X, DX, DY: Integer; begin DX := X2 - X1; DY := Y2 - Y1; for X := 0 to 255 do LUT[X] := ByteRound((X - X1) * DY / DX + Y1); end; function GetBrightnessContrastLUT(var LUT: TByteLUT; const Brightness, Contrast: Single): Boolean; var B, C: Integer; X1, Y1, X2, Y2: Integer; begin X1 := 0; Y1 := 0; X2 := 255; Y2 := 255; B := Round(Brightness * 255); C := Round(Contrast * 127); if C >= 0 then begin Inc(X1, C); Dec(X2, C); Dec(X1, B); Dec(X2, B); end else begin Dec(Y1, C); Inc(Y2, C); Inc(Y1, B); Inc(Y2, B); end; GetLinearLUT(LUT, X1, Y1, X2, Y2); Result := (B <> 0) or (C <> 0); end; var LImageInfo: TImageInfo; LDibInfo: TDibSection; I, L: Integer; P: PBGRA; R, G, B, A: Byte; LUT: TByteLUT; LHasLUT: Boolean; begin Result := nil; if (ASource = nil) or (ASource.ColorDepth <> cd32bit) then Exit; Result := TImageList.Create(ASource.Owner); try Result.ColorDepth := cd32bit; Result.Assign(ASource); Result.Masked := False; FillChar(LImageInfo, SizeOf(LImageInfo), 0); ImageList_GetImageInfo(Result.Handle, 0, LImageInfo); FillChar(LDibInfo, SizeOf(LDibInfo), 0); GetObject(LImageInfo.hbmImage, SizeOf(LDibInfo), @LDibInfo); P := LDibInfo.dsBm.bmBits; LHasLUT := GetBrightnessContrastLUT(LUT, ABrightness, AContrast); for I := 0 to LDibInfo.dsBm.bmHeight * LDibInfo.dsBm.bmWidth - 1 do begin A := PA; R := MulDiv(PR, $FF, A); G := MulDiv(PG, $FF, A); B := MulDiv(PB, $FF, A); if LHasLUT then begin R := LUT[R]; G := LUT[G]; B := LUT[B]; end; if AGrayscale > 0 then begin L := (R * 61 + G * 174 + B * 21) shr 8; if AGrayscale >= 1 then begin R := L; G := L; B := L; end else begin R := ByteRound(R + (L - R) * AGrayscale); G := ByteRound(G + (L - G) * AGrayscale); B := ByteRound(B + (L - B) * AGrayscale); end; end; if AAlpha <> 1 then begin A := ByteRound(A * AAlpha); PA := A; end; PR := MulDiv(R, A, $FF); PG := MulDiv(G, A, $FF); PB := MulDiv(B, A, $FF); Inc(P); end; except FreeAndNil(Result); end; end; 

рдХрд╛рд░реНрдп рддрд░реНрдХ:



рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдЕрдзрд┐рдХрд╛рдВрд╢ рдбреЙрд▓реНрдлрд╝рд┐рд╕реНрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрдПрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╕рдордЭрддрд╛ рд╣реВрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, TImageList рдореЗрдВ DIB рдХреА рдЫрд╡рд┐ рдХреЛ рдПрдХ рдкреНрд░реАрдорд┐рдпрд░ рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреЙрд▓ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдореВрд▓ рдореВрд▓реНтАНрдп рдореВрд▓реНтАНрд┐рд╡ () рдХреЗ рд╕рд╛рде рд░рдВрдЧреАрди рдЪреИрдирд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдСрдкрд░реЗрд╢рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдореВрд▓ рдкрд┐рдХреНрд╕реЗрд▓ рдкреНрд░рд╛рд░реВрдк рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЪрдордХ рдФрд░ рдХрдВрдЯреНрд░рд╛рд╕реНрдЯ рдмрджрд▓рдирд╛ LUT (рд▓реБрдХрдЕрдк рдЯреЗрдмрд▓) - рд▓реБрдХрдЕрдк рдЯреЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо 2 рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдПрдХ рд░реИрдЦрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рдЪрдордХ рдФрд░ рдХрдВрдЯреНрд░рд╛рд╕реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗрд╡рд▓ рд╡рд╛рдВрдЫрд┐рдд рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдкреНрд░рддреНрдпрдХреНрд╖ рд╕реБрдзрд╛рд░ рдХреЗ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╣рдо рд╕рднреА рд░рдВрдЧ рдЪреИрдирд▓реЛрдВ рдкрд░ рд╕рдорд╛рди рд╕реБрдзрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ рдПрдХ LUT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдЧреНрд░реЗрд╕реНрдХреЗрд▓ рдХреЛ рдмрджрд▓рдирд╛, рдореВрд▓ рдореВрд▓реНрдп рд╕реЗ рдСрдлрд╕реЗрдЯ рдХреЛ рдХреБрд▓ рд░рдВрдЧ рдЪрдордХ рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдЧреНрд░реАрд╕реЗрдХреЗрд▓ рдХреЗ рддрд░реНрдХ рдХрд╛ рдмрдбрд╝рд╛ рдореВрд▓реНрдп, рд╕рдордЧреНрд░ рдЪрдордХ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдХрд░реАрдм рдирдпрд╛ рдореВрд▓реНрдп, рдЬреЛ рд╕рднреА рд░рдВрдЧ рдЪреИрдирд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рде рдЧреНрд░реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдиреНрдирд┐рдХрдЯрди рджреЗрддрд╛ рд╣реИред

рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рд╕реНрд╡-рдирд┐рд╣рд┐рдд рд╣реИ рдФрд░ рдЗрд╕реЗ рддреГрддреАрдп-рдкрдХреНрд╖ рдШрдЯрдХреЛрдВ рдпрд╛ рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯрд╛ рдбреЗрдореЛ рд▓рд┐рдЦрд╛ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдбреЗрдореЛ рдХрд╛ рд╕реЛрд░реНрд╕ рдХреЛрдб рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдореВрд▓ рдкреНрд░рддреАрдХ



рдорд╛рдирдХ рдЕрдХреНрд╖рдо рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рдореВрд▓ рдЪрд┐рд╣реНрди



рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдкреНрд░рддреАрдХ 10% рдХреА рд╡реГрджреНрдзрд┐ рд╣реБрдИ



рд╡рд┐рдХрд▓рд╛рдВрдЧ рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рдкреНрд░рддреАрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреВрд░реЗ рд░рдВрдЧ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ 50% рддрдХ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ



рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЗ рдбрд┐рдЬрд╛рдЗрдиреЛрдВ рдореЗрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИрдВред рдПрдХ рдЕрдЪреНрдЫрд╛ рдХреЛрдбрд┐рдВрдЧ рд╣реИ!

UPD : рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ ColorDepth = cd32bit рдореЛрдб рдореЗрдВ рдЫрд╡рд┐ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреА рд╣реИред

UPD2 :: рд╕рдВрдХрд▓рд┐рдд рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рдЖрдЗрдХрди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ "рдмреНрд▓реИрдХ" рдкреГрд╖реНрдарднреВрдорд┐ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреА рд╣реИ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ ред рдбреЗрд▓реНрдлреА рдПрдХреНрд╕рдИ 3 рд╕реЗ рдбреЗрд▓реНрдлреА рдПрдХреНрд╕рдИ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЧрд▓рдд рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рдХрд╛рд░рдг рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдИред

UPD3 : 32 рдмрд┐рдЯ рдЕрдХреНрд╖рдо рдЖрдЗрдХрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдВрдбреЛрдЬ 2000 рдкрд░ рдЪрд▓рдиреЗ рдкрд░, рдПрдХ рдбрд┐рдорд┐рдВрдЧ рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдУрдПрд╕ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ 2000 рд╡реАрдВ рдЫреБрдЯреНрдЯреА рдХреЗ рд▓рд┐рдП AAlpha = 1 рдЫреЛрдбрд╝ рджреЗрдВ, рдлрд┐рд░ рдЖрдЗрдХрди рд╕рд┐рд░реНрдл рдЧреНрд░реЗ рд╣реЛрдВрдЧреЗред

Source: https://habr.com/ru/post/In160455/


All Articles