PDA

View Full Version : سوال: چگونه می توان تصویر را Invert color کرد؟



drahmadtaraffoo
چهارشنبه 24 فروردین 1390, 13:34 عصر
بسم الله الرحمن الرحیم
با سلام خدمت دوستان عزیز
من یک Imge دارم که در آن تصویر نمایش داده می شود چگونه می توانم رنگ های آنرا Invert کنم؟
و آیا می توان با یک Slider رنگ را بین رنگ اصلی و رنگ Invert شده کم و زیاد کرد؟
متشکرم
:قلب:

Felony
چهارشنبه 24 فروردین 1390, 13:47 عصر
این کد رو قبلا نوشته بودم :
var
X, Y: Integer;
Co, R, G, B: TColor;
begin
for X:= 0 to Image1.Width do
for Y:= 0 to Image1.Height do
begin
Co:= Image1.Canvas.Pixels[X, Y];
R:= GetRValue(Co);
G:= GetGValue(Co);
B:= GetBValue(Co);
Co:= (R+G+B) div 3;
Co:= 255-Co;
Image2.Canvas.Pixels[X,Y]:= RGB(Co, Co, Co);
end;
end;

در مورد سوال دوم هم میشه ، کافیه به جای عدد 255 در خط زیر عدد مورد نظر رو قرار بدید ( مقدار Value شئ Trackbar یا ... ) :
Co:= 255-Co;

SAASTN
چهارشنبه 24 فروردین 1390, 16:59 عصر
این کد رو قبلا نوشته بودم :
ولی این کد شدت نوری هر پیکسل رو حساب می کنه (اون هم نه بطور دقیق) و اون رو Invert می کنه که نتیجه یه تصویر Grayscale هست نه Invert شده تصویر اصلی.

کافیه به جای عدد 255 در خط زیر عدد مورد نظر رو قرار بدید ( مقدار Value شئ Trackbar یا ... )
جسارتا این مورد هم اشتباه هست، تصور بفرمائید که مقدار Co از مقدار جایگزین 255 بیشتر بشه ، که نتیجه یه تغییر رنگ آنی در تصویر هست.

پاسخ:
function TForm1.GetInvertedValue(const Value: Byte;
const Strength: Double): Byte;
begin
Result := Round((255 * Strength - 2 * Strength * Value + Value) );
end;

procedure TForm1.InvertImage(const Source, Dest: TBitmap; const Strength: Double);
var
I: Integer;
J: Integer;
SP, DP: PByteArray;
begin
for I := 0 to Source.Height - 1 do
begin
SP := Source.ScanLine[I];
DP := Dest.ScanLine[I];
for J := 0 to Source.Width - 1 do
begin
DP^[J * 3 + 0] := GetInvertedValue(SP^[J * 3 + 0], Strength);
DP^[J * 3 + 1] := GetInvertedValue(SP^[J * 3 + 1], Strength);
DP^[J * 3 + 2] := GetInvertedValue(SP^[J * 3 + 2], Strength);
end;
end;
end;

Felony
چهارشنبه 24 فروردین 1390, 17:27 عصر
ولی این کد شدت نوری هر پیکسل رو حساب می کنه (اون هم نه بطور دقیق) و اون رو Invert می کنه که نتیجه یه تصویر Grayscale هست نه Invert شده تصویر اصلی.

جسارتا این مورد هم اشتباه هست، تصور بفرمائید که مقدار Co از مقدار جایگزین 255 بیشتر بشه ، که نتیجه یه تغییر رنگ آنی در تصویر هست.

پاسخ:
function TForm1.GetInvertedValue(const Value: Byte;
const Strength: Double): Byte;
begin
Result := Round((255 * Strength - 2 * Strength * Value + Value) );
end;

procedure TForm1.InvertImage(const Source, Dest: TBitmap; const Strength: Double);
var
I: Integer;
J: Integer;
SP, DP: PByteArray;
begin
for I := 0 to Source.Height - 1 do
begin
SP := Source.ScanLine[I];
DP := Dest.ScanLine[I];
for J := 0 to Source.Width - 1 do
begin
DP^[J * 3 + 0] := GetInvertedValue(SP^[J * 3 + 0], Strength);
DP^[J * 3 + 1] := GetInvertedValue(SP^[J * 3 + 1], Strength);
DP^[J * 3 + 2] := GetInvertedValue(SP^[J * 3 + 2], Strength);
end;
end;
end;


درسته من دقت نکردم ، اسم پوشه برنامه رو اشتباها InvertColor گزاشته بودم و بدون خوندن کد قرارش دادم ،الان که کد رو نگاه کردم اون گرفتن رنگ ها و تقسیم بر 3 رو دیدم فهمیدم این کد رو برای Grayscale با شدت نور مختلف نوشته بودم ...