Форум: "Начинающим";
Текущий архив: 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