Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];

Вниз

Как сделать такую опцию как изменение цвета в Фотошопе?   Найти похожие ветки 

 
Живописец   (2006-08-03 07:26) [0]

Так двигаешь ползунок, и цвета на картинке меняются на другие. Причём плавно. Переходят из синего в зелёный, из зелёного в красный, и т . д.

Как эта опция устроена? Я хотел бы такую же сделать, но не знаю как.


 
Zeqfreed ©   (2006-08-03 07:36) [1]

type
 TRGB = record
  B, G, R : Byte;
 end;

 PARGB = ^ARGB;
 ARGB = array [0..1] of TRGB;

. . .

function HSLToRGB(H, S, L : Single) : TRGB; overload;

 function Hue2RGB(v1, v2, vH : Single) : Single;
 begin
  if (vH < 0) then vH := vH + 1;
  if (vH > 1) then vH := vH - 1;

  if ((6 * vH) < 1) then
   Result := (v1 + (v2 - v1) * 6 * vH)
  else if ((2 * vH) < 1) then
   Result := v2
  else if ((3 * vH) < 2) then
   Result := (v1 + (v2 - v1) * ((2 / 3) - vH) * 6)
  else
   Result := v1;
 end;

var
 v1, v2 : Single;
begin
 if (S = 0) then begin
  Result.R := Trunc(L * 255);
  Result.G := Trunc(L * 255);
  Result.B := Trunc(L * 255);
 end else begin
  if (L < 0.5) then
   v2 := L * (1 + S)
  else
   v2 := (L + S) - (S * L);

  v1 := 2 * L - v2;

  Result.R := Trunc(255 * Hue2RGB(v1, v2, H + (1 / 3)));
  Result.G := Trunc(255 * Hue2RGB(v1, v2, H));
  Result.B := Trunc(255 * Hue2RGB(v1, v2, H - (1/3)));
 end;
end;

procedure DrawColorSquare(Dest : TBitmap; Width, Height : Integer; Lightness : Single);
var
 i, j : Integer;
 s, l : Single;
 p : PARGB;
begin
 l := Lightness;

 for j := 0 to Height - 1 do begin
  s := (Height-j) / Height;

  p := Dest.ScanLine[j];
  for i := 0 to Width - 1 do begin
   p[i] := HSLToRGB(i / Width, s, l); //p[i] := HSLToRGB(Trunc((i*360) / Width), s, l);
  end;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Image1.Picture.Bitmap.Width := Image1.Width;
 Image1.Picture.Bitmap.Height := Image1.Height;
 Image1.Picture.Bitmap.PixelFormat := pf24bit;
 DrawColorSquare(Image1.Picture.Bitmap, Image1.Width, Image1.Height, 0.5);
end;


Начать копать можно отсюда :)


 
Живописец   (2006-08-04 07:42) [2]

Непойму я. Можно словами объяснить принцип?


 
Zeqfreed ©   (2006-08-04 08:02) [3]

> [2] Живописец   (04.08.06 07:42)

Принцип чего? Если вам нужно повторить элемент управления для выбора цвета из фотошопа, то это уж сами, за вас никто не станет делать. Мой код рисует основную шкалу цветов в цветовом пространстве HSL (что можно было узнать из его простейшего применения). Думаю, что какие-то моменты из него можно взять.


 
Zeqfreed ©   (2006-08-04 09:19) [4]

Скука — двигатель прогресса :)
http://zeespot.net.ru/files/cs-src.zip (4 Кб) — исходные коды под D7.
http://zeespot.net.ru/files/cs-bin.zip (200 Кб) — исполнимый файл.

В примере используется несколько иная цветовая модель (HSL) — в Фотошопе HSB, так что вид немного отличается. Пример написан на скорую руку и его не стоит рассматривать как пример идеального кода ;) Ну, как говорится, enjoy!


 
werb   (2006-08-04 12:37) [5]

>> Zeqfreed ©   (04.08.06 09:19) [4]
скачал, запустил исполнимый файл:
на большом поле (верхнем левом квадрате) при выборе цвет в нижнем прямоугольнике цвет меняется кооректно.
при выборе же на прямоугольнике самом правом, все меняется обращенно по вертикали.


 
Zeqfreed ©   (2006-08-04 12:39) [6]

> [5] werb   (04.08.06 12:37)

Угу, правильно :) Забыл «перевернуть». Думаю, что несложно самому разобраться и добавить «1 -» в нужную строчку.


 
werb   (2006-08-04 12:48) [7]

>> Zeqfreed ©   (04.08.06 12:39) [6]

Да мне не надо.. ) просто посмотрел..


 
Живописец   (2006-08-08 04:51) [8]

Я наверно неверно объяснил.
Я имел в виду опцию. Hue/Saturation. Там водишь ползунок туда-сюда и у редактируемой картинки меняются цвета ...

Какой там принцип?


 
KilkennyCat ©   (2006-08-08 05:02) [9]

Принцип вызова репаинта картинки в событии изменения положения ползунка, с новыми параметрами, основанными на позиции ползунка.


 
Zeqfreed ©   (2006-08-08 13:34) [10]

> [8] Живописец   (08.08.06 04:51)

unit Main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Math, ComCtrls, jpeg, ExtCtrls, StdCtrls;

type
 TRGB = record
  B, G, R : Byte;
 end;

 THSL = record
  H, S, L : Single;
 end;

 PARGB = ^ARGB;
 ARGB = array [0..1] of TRGB;

 TForm1 = class(TForm)
   Image1: TImage;
   TrackBar1: TTrackBar;
   OD: TOpenDialog;
   Button1: TButton;
   procedure TrackBar1Change(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 origBMP : TBitmap;

implementation

{$R *.dfm}

function HSLToRGB(H, S, L : Single) : TRGB;

function Hue2RGB(v1, v2, vH : Single) : Single;
begin
 while (vH < 0) do vH := vH + 1;
 while (vH > 1) do vH := vH - 1;

 if ((6 * vH) < 1) then
  Result := (v1 + (v2 - v1) * 6 * vH)
 else if ((2 * vH) < 1) then
  Result := v2
 else if ((3 * vH) < 2) then
  Result := (v1 + (v2 - v1) * ((2 / 3) - vH) * 6)
 else
  Result := v1;
end;

var
v1, v2 : Single;
begin
if (S = 0) then begin
 Result.R := Trunc(L * 255);
 Result.G := Trunc(L * 255);
 Result.B := Trunc(L * 255);
end else begin
 if (L < 0.5) then
  v2 := L * (1 + S)
 else
  v2 := (L + S) - (S * L);

 v1 := 2 * L - v2;

 Result.R := Trunc(255 * Hue2RGB(v1, v2, H + (1/3)));
 Result.G := Trunc(255 * Hue2RGB(v1, v2, H));
 Result.B := Trunc(255 * Hue2RGB(v1, v2, H - (1/3)));
end;
end;

function RGBToHSL(sR, sG, sB : Byte) : THSL;
var
 R, G, B : Single;
 dR, dG, dB : Single;
 MaxC, MinC, Delta : Single;
begin
 R := sR/255;
 G := sG/255;
 B := sB/255;
 MaxC := Max(Max(R, G), B);
 MinC := Min(Min(R, G), B);
 Delta := MaxC - MinC;

 Result.L := (MaxC + MinC) * 0.5;

 if (Delta = 0) then begin
  Result.H := 0;
  Result.S := 0;
 end else begin
  if (Result.L < 0.5) then
   Result.S := Delta / (MaxC + MinC)
  else
   Result.S := Delta / (2 - MaxC - MinC);

  dR := (((MaxC - R) / 6) + (Delta / 2)) / Delta;
  dG := (((MaxC - G) / 6) + (Delta / 2)) / Delta;
  dB := (((MaxC - B) / 6) + (Delta / 2)) / Delta;

  if (MaxC = R) then
   Result.H := dB - dG
  else if (MaxC = G) then
   Result.H := (1/3) + dR - dB
  else
   Result.H := (2/3) + dG - dR;

  if (Result.H < 0) then Result.H := Result.H + 1;
  if (Result.H > 1) then Result.H := Result.H - 1;      
 end;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
var
i, j : Integer;
s, l : Single;
p, p2 : PARGB;
RGB : TRGB;
HSL : THSL;
begin
for j := 0 to Image1.Height - 1 do begin
 p := origBMP.ScanLine[j];
 p2 := Image1.Picture.Bitmap.ScanLine[j];
   
 for i := 0 to Image1.Width - 1 do begin
  HSL := RGBToHSL(p[i].R, p[i].G, p[i].B);
  HSL.H := HSL.H + (TrackBar1.Position/360);
  RGB := HSLToRGB(HSL.H, HSL.S, HSL.L);
  p2[i].R := RGB.R;
  p2[i].G := RGB.G;
  p2[i].B := RGB.B;
 end;
end;

Image1.Refresh;
Caption := Format("%d : %2.2f", [TrackBar1.Position, TrackBar1.Position/360]);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 TrackBar1.Min := -180;
 TrackBar1.Max := 180;
 TrackBar1.Position := 0;  

 Image1.Picture.Bitmap.PixelFormat := pf24bit;
 Image1.Picture.Bitmap.Width := Image1.Width;
 Image1.Picture.Bitmap.Height := Image1.Height;

 origBMP := TBitmap.Create;
 origBMP.PixelFormat := pf24bit;
 origBMP.Width := Image1.Width;
 origBMP.Height := Image1.Height;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 JPG : TJPEGImage;
begin
 if OD.Execute then begin
  if FileExists(OD.FileName) then begin
   JPG := TJPEGImage.Create;
   try
    JPG.LoadFromFile(OD.FileName);
    Image1.Picture.Bitmap.Canvas.StretchDraw(Image1.Picture.Bitmap.Canvas.ClipRect, JPG);
    origBMP.Canvas.StretchDraw(Image1.Picture.Bitmap.Canvas.ClipRect, JPG);    
   finally
    JPG.Free;
   end;
  end;
 end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 origBMP.Free;
end;

end.


 
Живописец   (2006-08-09 02:38) [11]


> Zeqfreed ©   (08.08.06 13:34) [10]

Это не то.

Загрузи в Фотошоп какую ниубдь фотографию. Вызови Hue/Saturation, подвигай ползунок, и посмотри как при этом меняются на фотографии.


 
KilkennyCat ©   (2006-08-09 03:34) [12]

Во-первых, у фотошопа может быть свое представление об алгоритме, и ээффекты не будут достаточно одинаковыми.
Во-вторых, всей данной ветки трижды достаточно, чтоб реализовать то, реализацию чего Вы предлагаете посмотреть в фотошопе.
Если это не так, то тогда лично мне непонятно, что Вы желаете узнать. Возможно, в этом случае стоит переформулировать вопрос.


 
Zeqfreed ©   (2006-08-09 11:24) [13]

> [11] Живописец   (09.08.06 02:38)

> Это не то.

Правда? Извините.

> Загрузи в Фотошоп какую ниубдь фотографию. Вызови Hue/Saturation,
> подвигай ползунок, и посмотри как при этом меняются на
> фотографии.

Окей. Загружаю фотографию помидора (http://upload.wikimedia.org/wikipedia/en/thumb/0/0e/Tomato2.jpg/250px-Tomato2.jpg) в Фотошоп, вызываю диалог Hue/Saturation (Ctrl + U), передвигаю ползунок Hue до упора вправо (+180) — помидор стал бирюзовым. Хорошо. Дальше загружаю свой пример, загружаю фотографию того же самого помидора, передвигаю ползунок до упора вправо (+180) — помидор стал бирюзовым. Что я сделал неправильно?


 
Zeqfreed ©   (2006-08-09 11:27) [14]

> [12] KilkennyCat ©   (09.08.06 03:34)

Да вроде я повторил один-в-один алгоритм Фотошопа, т.к. в этом диалоге он, в отличии от диалога выбора цвета, также использует модель HSL. Даже если и есть погрешности в виду различных алгоритмов перевода цветовых моделей, то они не заметны на глаз.


 
KilkennyCat ©   (2006-08-09 12:54) [15]

> [14] Zeqfreed ©   (09.08.06 11:27)


У некоторых реализации HSL заметны на глаз... я на днях с таким столкнулся.   Возможно, чуть не так округляют, и помидор становится не бирюзовым, а почтибирюзовым :)

Но автор, похоже, даже и не пробовал вышеопубликованный пример.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.044 c
15-1154073849
Petr V. Abramov
2006-07-28 12:04
2006.08.27
Oracle XE


15-1154599112
SerJaNT
2006-08-03 13:58
2006.08.27
8bf


8-1120813184
ronyn
2005-07-08 12:59
2006.08.27
Проблемы с установкой DSPack.


2-1154634657
Drashka
2006-08-03 23:50
2006.08.27
BTClasses


2-1154603864
Max.66RUS
2006-08-03 15:17
2006.08.27
Как убить процесс, зная его имя...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский