博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RGB颜色空间与YUV等颜色空间之间的转换单元
阅读量:4149 次
发布时间:2019-05-25

本文共 3675 字,大约阅读时间需要 12 分钟。

DelphiCode:
unit RGBYUV;interfaceuses Windows,Classes,Graphics,Math;function RGBToColor(R,G,B: Byte): TColor;overload;function RGBToColor(Color : Longint): TColor;overload;procedure ColorToYUV(RGB: TColor; out Y, Cb, Cr: byte);function YUVtoColor(Y, Cb, Cr: Byte): TColor;implementationfunction RGBToColor(R,G,B: Byte): TColor;begin  Result := R or (G shl 8) or (B shl 16);end;function RGBToColor(Color : Longint): TColor;var  R,G,B,A : Byte;begin  R := Color and $FF;  G := (Color shr 8) and $FF;  B := (Color shr 16) and $FF;  A := $00;  Result := R or (G shl 8) or (B shl 16) or (A shl 24);end;procedure ColorToRGB(Color: TColor; out R, G, B: Byte);begin  R := Color and $FF;  G := (Color shr 8) and $FF;  B := (Color shr 16) and $FF;end;procedure ColorToCMY(Color: TColor; out C, M, Y: Byte);var  R,G,B : Byte;begin  ColorToRGB(Color, R, G, B);  C := 255 - R;  M := 255 - G;  Y := 255 - B;end;function CMYToColor(C, M, Y: Byte): TColor;begin  Result := (255 - C) or ((255 - M) shl 8) or ((255 - Y) shl 16);end;function HSLtoColor(H, S, L: Double): TColor;var  M1, M2: double;  function HueToColourValue (Hue: double) : byte;  var    V : double;  begin    if Hue < 0 then      Hue := Hue + 1    else      if Hue > 1 then        Hue := Hue - 1;    if 6 * Hue < 1 then      V := M1 + (M2 - M1) * Hue * 6    else      if 2 * Hue < 1 then        V := M2      else        if 3 * Hue < 2 then          V := M1 + (M2 - M1) * (2/3 - Hue) * 6        else          V := M1;    Result := round (255 * V)  end;var  R, G, B: byte;begin  if S = 0 then  begin    R := round (255 * L);    G := R;    B := R  end  else  begin    if L <= 0.5 then      M2 := L * (1 + S)    else      M2 := L + S - L * S;    M1 := 2 * L - M2;    R := HueToColourValue (H + 1/3);    G := HueToColourValue (H);    B := HueToColourValue (H - 1/3)  end;  Result := RGB (R, G, B)end;procedure ColortoHSL(RGB: TColor; out H, S, L: double);var  R, G, B : double;  D, Cmax, Cmin: double;begin  R := GetRValue (RGB) / 255;  G := GetGValue (RGB) / 255;  B := GetBValue (RGB) / 255;  Cmax := Max (R, Max (G, B));  Cmin := Min (R, Min (G, B));  // calculate luminosity  L := (Cmax + Cmin) / 2;  if Cmax = Cmin then  begin    H := 0;// it's actually undefined    S := 0;  end  else  begin    D := Cmax - Cmin;    // calculate Saturation    if L < 0.5 then      S := D / (Cmax + Cmin)    else      S := D / (2 - Cmax - Cmin);    // calculate Hue    D_R := (((Cmax - R) / 6) + (D / 2)) / D;    D_G := (((Cmax - G) / 6) + (D / 2)) / D;    D_B := (((Cmax - B) / 6) + (D / 2)) / D;    if      R = Cmax then  H := (D_B - D_G)    else if G = Cmax then  H := (1 / 3) + D_R - D_B    else if B = Cmax then  H := (2 / 3) + D_G - D_R;    if H < 0 then H := H + 1;    if H > 1 then H := H - 1;  end;end;procedure ColorToYUV(RGB: TColor; out Y, Cb, Cr: byte);{Lum (Y) ranges from 16 to 235.Cb  (U) ranges from 16 to 240.Cr  (V) ranges from 16 to 240.}var  R,G,B : byte;  t: Double;begin  R := GetRValue(RGB);  G := GetGValue(RGB);  B := GetBValue(RGB);  Y  := Round( (0.257 * R) + (0.504 * G) + (0.098 * B) + 16 );  Cb := Round( (-0.148 * R) - (0.291 * G) + (0.439 * B) + 128 );  Cr := Round( (0.439 * R) - (0.368 * G) - (0.071 * B) + 128 );  {y := Round(0.299*R + 0.587*G + 0.114*B);  Cb := Round(0.564*(B - Y ));  Cr := Round(0.713*(R - Y )) }end;  function YUVtoColor(Y, Cb, Cr: Byte): TColor;{Lum (Y) ranges from 16 to 235.Cb  (U) ranges from 16 to 240.Cr  (V) ranges from 16 to 240.}var  R,G,B: Byte;begin  G := Round( (1.164 * (Y-16)) - (0.391 * (Cb-128)) - (0.813 * (Cr-128)) );  R := Round( (1.164 * (Y-16)) + (1.596 * (Cr-128)) );  B := Round( (1.164 * (Y-16)) + (2.018 * (Cb-128)) );  Result := RGBToColor(R, G, B);end;  end.

转载地址:http://nrsti.baihongyu.com/

你可能感兴趣的文章
[LeetCode]Combinations
查看>>
[LeetCode]Construct Binary Tree from Inorder and Postorder Traversal
查看>>
[LeetCode]Convert Sorted Array to Binary Search Tree
查看>>
[LeetCode]Longest Valid Parentheses
查看>>
[LeetCode]Maximal Rectangle
查看>>
[LeetCode]Maximum Subarray
查看>>
[LeetCode]Median of Two Sorted Arrays
查看>>
[LeetCode]Merge Intervals
查看>>
[LeetCode]Merge k Sorted Lists
查看>>
[LeetCode]Merge Sorted Array
查看>>
[LeetCode]Merge Two Sorted Lists
查看>>
[LeetCode]Minimum Depth of Binary Tree
查看>>
[LeetCode]Minimum Path Sum
查看>>
[LeetCode]Minimum Window Substring
查看>>
[LeetCode]Multiply Strings
查看>>
[LeetCode]N-Queens II
查看>>
[LeetCode]Next Permutation
查看>>
[LeetCode]Palindrome Number
查看>>
[LeetCode]Palindrome Partitioning
查看>>
[LeetCode]Palindrome Partitioning II
查看>>