创建RGB、CMYK颜色分量圆代码
創建RGB分量圓:
function CreateRGBCircles(const size: INTEGER;
?? const Rflag, Gflag, Bflag: BOOLEAN): TBitmap;
var
?? AdjustedSize: INTEGER;
?? Border: INTEGER;
?? i, iR, iG, iB: INTEGER;
?? j, jR, jG, jB: INTEGER;
?? jOffset: INTEGER;
?? RadiusSquared: INTEGER;
?? row: pRGBTripleArray;
?? function DistanceSquared(const x1, y1, x2, y2: INTEGER): INTEGER;
?? begin
????? RESULT := SQR(x1 - x2) + SQR(y1 - y2)
?? end {兩點間距平方};
begin
?? Border := MulDiv(size, 5, 1000);
?? AdjustedSize := size - 2 * Border;
?? RadiusSquared := SQR(MulDiv(AdjustedSize, 2, 6));
?? iR := Border + MulDiv(AdjustedSize, 2, 6);
?? iG := Border + MulDiv(AdjustedSize, 3, 6);
?? iB := Border + MulDiv(AdjustedSize, 4, 6);
?? //RGB顏色圈內的橫坐標
?? jOffset := ROUND(AdjustedSize * (2 - SQRT(3)) / 12);
?? jR := jOffset + Border + Round(AdjustedSize * (2 + SQRT(3)) / 6);
?? jG := jOffset + Border + MulDiv(AdjustedSize, 2, 6);
?? jB := jR;
?? //RGB顏色圈內的縱坐標
?? RESULT := TBitmap.Create;
?? //輸出位圖
?? RESULT.Width := size;
?? RESULT.Height := size;
?? RESULT.PixelFormat := pf24bit;
?? RESULT.Canvas.Brush.Color := RGB(0, 0, 0);
?? // 黑色背景
?? RESULT.Canvas.FillRect(RESULT.Canvas.ClipRect);
?? //填充
?? for j := 0 to RESULT.Height - 1 do
????? begin
???????? row := RESULT.Scanline[j];
???????? for i := 0 to RESULT.Width - 1 do
??????????? begin
?????????????? with row[i] do
????????????????? begin
???????????????????? if Rflag and (DistanceSquared(i, j, iR, jR) < RadiusSquared)
??????????????????????? then rgbtRed := 255;
???????????????????? //紅色分量為255
???????????????????? if GFlag and (DistanceSquared(i, j, iG, jG) < RadiusSquared)
??????????????????????? then rgbtGreen := 255;
???????????????????? //綠色分量為255
???????????????????? if BFlag and (DistanceSquared(i, j, iB, jB) < RadiusSquared)
??????????????????????? then rgbtBlue := 255
??????????????????????? //藍色分量為255
????????????????? end
??????????? end
????? end
end ;
?
創建CMYK分量圓:
function CreateCMYCircles(const size: INTEGER;
?? const Cflag, Mflag, Yflag: BOOLEAN): TBitmap;
var
?? AdjustedSize: INTEGER;
?? Border: INTEGER;
?? i, iC, iM, iY: INTEGER;
?? j, jC, jM, jY: INTEGER;
?? jOffset: INTEGER;
?? RadiusSquared: INTEGER;
?? row: pRGBTripleArray;
?? function DistanceSquared(const x1, y1, x2, y2: INTEGER): INTEGER;
?? begin
????? RESULT := SQR(x1 - x2) + SQR(y1 - y2)
?? end;
begin
?? Border := MulDiv(size, 5, 1000);
?? AdjustedSize := size - 2 * Border;
?? RadiusSquared := SQR(MulDiv(AdjustedSize, 2, 6));
?? iC := Border + MulDiv(AdjustedSize, 2, 6);
?? iM := Border + MulDiv(AdjustedSize, 3, 6);
?? iY := Border + MulDiv(AdjustedSize, 4, 6);
?? //CMY顏色圈的點的橫坐標
?? jOffset := ROUND(AdjustedSize * (2 - SQRT(3)) / 12);
?? jC := jOffset + Border + Round(AdjustedSize * (2 + SQRT(3)) / 6);
?? jM := jOffset + Border + MulDiv(AdjustedSize, 2, 6);
?? jY := jC;
?? //CMY顏色圈的點的縱坐標
?? RESULT := TBitmap.Create;
?? RESULT.Width := size;
?? RESULT.Height := size;
?? RESULT.PixelFormat := pf24bit;
?? //創建輸出位圖
?? RESULT.Canvas.Brush.Color := RGB(255, 255, 255); // white
?? RESULT.Canvas.FillRect(RESULT.Canvas.ClipRect);
?? //白色背景
?? for j := 0 to RESULT.Height - 1 do
????? begin
???????? row := RESULT.Scanline[j];
???????? for i := 0 to RESULT.Width - 1 do
??????????? begin
?????????????? with row[i] do
????????????????? begin
???????????????????? if Cflag and (DistanceSquared(i, j, iC, jC) < RadiusSquared)
??????????????????????? then rgbtRed := 0;
???????????????????? //紅色分量為0
???????????????????? if MFlag and (DistanceSquared(i, j, iM, jM) < RadiusSquared)
??????????????????????? then rgbtGreen := 0;
???????????????????? //綠色分量為0
???????????????????? if YFlag and (DistanceSquared(i, j, iY, jY) < RadiusSquared)
??????????????????????? then rgbtBlue := 0;
????????????????? end //藍色分量為0
??????????? end
????? end
end;
轉載于:https://www.cnblogs.com/zxg1982/archive/2009/03/22/1418897.html
總結
以上是生活随笔為你收集整理的创建RGB、CMYK颜色分量圆代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何访问ASP.Net网站bin目录内的
- 下一篇: 一步步学习汇编系列(7)