Cita:
Empezado por Neftalí
Eso me lleva a una pregunta. ¿Está definida esa "escala de sepia"?
Por ejemplo, la escala de Grises se obtiene asignando el mismo valor a los tres colores principales(R,G,B); Variando esos valores (pero siempre iguales en los tres) se obtienen los Grises. ¿Hay algo parecido para la escala de Sepia? ¿debe haber una especificación?
|
Hola a todos!
Con respecto a esta cuestión sólo quisiera añadir algo, es posible crear una escala de tonos sepia a nuestra conveniencia, es decir asi como hay una escala de 256 tonos de gris podemos crear una escala de 256 tonos en sepia, rojo, amarillo, azul, etc.
Aqui pongo un ejemplo de una escala de 256 tonos en sepia, en realidad solamente tomé un gradiente que comienza con café oscuro y que pasa por amarillos hasta llegar a blanco.
Código Delphi
[-]
const
TSepiaTonos: array[0..255] of TColor=(
$71730, $71831, $81932, $91A33, $A1B34, $B1C36, $C1D37, $D1E38,
$E2039, $E213A, $F223C, $10233D, $11243E, $12253F, $132640, $142742,
$152943, $152A44, $162B45, $172C46, $182D48, $192E49, $1A2F4A, $1B304B,
$1C324C, $1C334E, $1D344F, $1E3550, $1F3651, $203752, $213854, $223955,
$233B56, $233C57, $243D58, $253E5A, $263F5B, $27405C, $28415D, $29425E,
$2A4460, $2A4561, $2B4662, $2C4763, $2D4864, $2E4966, $2F4A67, $304B68,
$314D69, $314E6A, $324F6C, $33506D, $34516E, $35526F, $365370, $375472,
$385673, $385774, $395875, $3A5976, $3B5A78, $3C5B79, $3D5C7A, $3E5D7B,
$3F5F7D, $3F607E, $40617F, $416280, $426381, $436483, $446584, $456685,
$466886, $466987, $476A89, $486B8A, $496C8B, $4A6D8C, $4B6E8D, $4C6F8F,
$4D7190, $4D7291, $4E7392, $4F7493, $507595, $517696, $527797, $537898,
$547A99, $547B9B, $557C9C, $567D9D, $577E9E, $587F9F, $5980A1, $5A81A2,
$5B83A3, $5B84A4, $5C85A5, $5D86A7, $5E87A8, $5F88A9, $6089AA, $618AAB,
$628CAD, $628DAE, $638EAF, $648FB0, $6590B1, $6691B3, $6792B4, $6893B5,
$6995B6, $6996B7, $6A97B9, $6B98BA, $6C99BB, $6D9ABC, $6E9BBD, $6F9CBF,
$709EC0, $709FC1, $71A0C2, $72A1C3, $73A2C5, $74A3C6, $75A4C7, $76A5C8,
$77A7CA, $77A7CA, $78A7CA, $79A8CA, $7AA9CB, $7BA9CB, $7CAACC, $7DABCC,
$7EABCC, $7FACCD, $80ADCD, $81ADCE, $82AECE, $83AFCF, $85B0CF, $86B0CF,
$87B1D0, $88B2D0, $89B2D1, $8AB3D1, $8BB4D1, $8CB4D2, $8DB5D2, $8EB6D3,
$8FB7D3, $90B7D4, $91B8D4, $93B9D4, $94B9D5, $95BAD5, $96BBD6, $97BBD6,
$98BCD7, $99BDD7, $9ABED7, $9BBED8, $9CBFD8, $9DC0D9, $9EC0D9, $A0C1D9,
$A1C2DA, $A2C2DA, $A3C3DB, $A4C4DB, $A5C5DC, $A6C5DC, $A7C6DC, $A8C7DD,
$A9C7DD, $AAC8DE, $ABC9DE, $ACC9DF, $AECADF, $AFCBDF, $B0CCE0, $B1CCE0,
$B2CDE1, $B3CEE1, $B4CEE1, $B5CFE2, $B6D0E2, $B7D0E3, $B8D1E3, $B9D2E4,
$BBD3E4, $BCD3E4, $BDD4E5, $BED5E5, $BFD5E6, $C0D6E6, $C1D7E7, $C2D7E7,
$C3D8E7, $C4D9E8, $C5D9E8, $C6DAE9, $C7DBE9, $C9DCE9, $CADCEA, $CBDDEA,
$CCDEEB, $CDDEEB, $CEDFEC, $CFE0EC, $D0E0EC, $D1E1ED, $D2E2ED, $D3E3EE,
$D4E3EE, $D5E4EF, $D7E5EF, $D8E5EF, $D9E6F0, $DAE7F0, $DBE7F1, $DCE8F1,
$DDE9F1, $DEEAF2, $DFEAF2, $E0EBF3, $E1ECF3, $E2ECF4, $E4EDF4, $E5EEF4,
$E6EEF5, $E7EFF5, $E8F0F6, $E9F1F6, $EAF1F7, $EBF2F7, $ECF3F7, $EDF3F8,
$EEF4F8, $EFF5F9, $F0F5F9, $F2F6F9, $F3F7FA, $F4F8FA, $F5F8FB, $F6F9FB,
$F7FAFC, $F8FAFC, $F9FBFC, $FAFCFD, $FBFCFD, $FCFDFE, $FDFEFE, $FFFFFF);
Ahora la cuestión sola es tomar un vector de componentes de color (R,G,B) y aplicar una transformación que convierta a escala de 256 grises como las que han recomendado en este hilo.
Voy a tomar el producto punto como ejemplo:
GRIS=(R,G,B).(0.30,0.59,0.11)=R*0.30+G*0.59+B*0.11
Esto nos dará un valor entre [0..255] correspondiente a un color en la escala de 256 tonos de gris.
Ahora sólo buscamos el equivalente en la escala de 256 tonos sepia que construimos.
NuevoColor=TonosSepia[GRIS]
Un ejemplo de como aplicarlo sería
Código Delphi
[-]
type
TRGBArray = array[0..32767] of TRGBTriple;
PRGBArray = ^TRGBArray;
procedure TForm1.Button3Click(Sender: TObject);
var
Row: PRGBArray;
y,x,Gris: Integer;
begin
Image1.Picture.Bitmap.PixelFormat := pf24Bit;
for y := 0 to Image1.Picture.Bitmap.Height - 1 do
begin
Row := Image1.Picture.Bitmap.ScanLine[y];
for x := 0 to Image1.Picture.Bitmap.Width - 1 do
begin
Gris := Round(Row[x].rgbtRed*0.3 + Row[x].rgbtGreen*0.59 + Row[x].rgbtBlue*0.11);
Row[x].rgbtRed := GetRValue(ColorToRGB(TSepiaTonos[Gris]));
Row[x].rgbtGreen := GetGValue(ColorToRGB(TSepiaTonos[Gris]));
Row[x].rgbtBlue := GetBValue(ColorToRGB(TSepiaTonos[Gris]));
end;
end;
Image1.Repaint;
end;
Es tan sólo un ejemplo, la escala de tonos la he creado arbitrariamente y cada quien puede definir su propia escala de acuerdo a su preferencia.
Un saludo y seguimos en contacto