PDA

View Full Version : سوال: طریقه شطرنجی کردن عکس جهت نقشه فرش در قالیبافی ؟



pandco
چهارشنبه 10 اردیبهشت 1393, 17:42 عصر
با سلام خدمت دوستان

چطور میتونم یه عکس رو در دلفی به صورت شطرنجی در بیارم که تو قالیبافی استفاده بشه ؟ (مانند عکس های زیر)

ممنون


118508

یوسف زالی
چهارشنبه 10 اردیبهشت 1393, 19:04 عصر
سلام.
گرید رو در یک لایه جداگانه روش draw کنید.
کجاش مشکله؟

rahnema1
چهارشنبه 10 اردیبهشت 1393, 20:49 عصر
توی سی شارپ این جا توضیح داده شده:
http://barnamenevis.org/showthread.php?448691

hadisalahi2
پنج شنبه 11 اردیبهشت 1393, 10:23 صبح
کامپوننت imageEN و Envision همچین فیلترهایی رو به تصویر اعمال میکنند
خیلی ساده و فقط با یک خط دستور

pandco
شنبه 13 اردیبهشت 1393, 16:45 عصر
ممنون از توجه دوستان ارجمند
(گرید رو در یک لایه جداگانه روش draw کنید. ) امکانش هست زحمت بکشید کمی بیشتر توضیح بدید (یا کدی مشابه قرار بدید)چون کاربر معمولی هستم.

rahnema1
یک شنبه 14 اردیبهشت 1393, 17:21 عصر
این هم به زبان پاسکال

var
x, y, scale: integer;
Bitmap1: TBitmap;
Bitmap2: TBitmap;
begin
scale := 10;
Bitmap1 := TBitmap.Create;
Bitmap1.LoadFromFile('Bitmap1.bmp');
Bitmap2 := TBitmap.Create;
Bitmap2.SetSize(Bitmap1.Width * scale, Bitmap1.Height * scale);
Bitmap2.Canvas.StretchDraw(Rect(0, 0, Bitmap2.Width, Bitmap2.Height), Bitmap1);
with Bitmap2 do with Canvas do
begin
pen.Color := clRed;
for x := 0 to Bitmap1.Width do
begin
if (x mod 10) = 0 then pen.Width := 3
else if (x mod 5) = 0 then pen.Width := 2
else pen.Width := 1;
Line(x * scale, 0, x * scale, Bitmap1.Height * scale);
end;
for y := 0 to Bitmap1.Height do
begin
if (y mod 10) = 0 then pen.Width := 3
else if (y mod 5) = 0 then pen.Width := 2
else pen.Width := 1;
Line(0, y * scale, Bitmap1.Width * scale, y * scale);
end;
end;
Bitmap2.SaveToFile('Bitmap2.bmp');
end;

یوسف زالی
یک شنبه 14 اردیبهشت 1393, 17:57 عصر
procedure MakeGridOnControl(AGridImage: TImage; AHostImage: TImage; GridXSize, GridYSize: integer; GridXColor, GridYColor: TColor);
var
i: integer;
begin
if not Assigned(AGridImage) then
Exit;


if not Assigned(AHostImage) then
Exit;


if GridXSize <= 0 then
GridXSize := 1;


if GridYSize <= 0 then
GridYSize := 1;


AGridImage.Picture := nil;
AGridImage.BringToFront;
AGridImage.AutoSize := False;
AGridImage.SetBounds(AHostImage.Left, AHostImage.Top, AHostImage.Width, AHostImage.Height);
AGridImage.Transparent := true;
AGridImage.Canvas.Brush.Color := clWhite;
AGridImage.Canvas.FillRect(AGridImage.ClientRect);


i := GridXSize;
AGridImage.Canvas.Pen.Color := GridXColor;
while i < AGridImage.Width do
begin
AGridImage.Canvas.MoveTo(i, 0);
AGridImage.Canvas.LineTo(i, AGridImage.Height);
inc(i, GridXSize);
end;


i := GridYSize;
AGridImage.Canvas.Pen.Color := GridYColor;
while i < AGridImage.Height do
begin
AGridImage.Canvas.MoveTo(0, i);
AGridImage.Canvas.LineTo(AGridImage.Width, i);
inc(i, GridYSize);
end;
end;




نحوه استفاده:


MakeGridOnControl(Image1, Image2, 25, 25, clRed, clBlue);


این فقط برای نمایشه، اگر لازمه که تصویر نهایی ذخیره بشه یک کار کوچولو هم واسه مرج کردن باید انجام بدید.

اما اونچه که در ذهن منه چیز دیگه هست. شما باید روی تصویر اصلی چیزی نندازید.
باید خود تصویر رو تیکه تیکه کنید. یه چیزی مثل کوبلن.
اگر همین طوره داستان کلا فرق خواهد کرد.

یوسف زالی
یک شنبه 14 اردیبهشت 1393, 18:21 عصر
در حقیقت می شه این کد:


procedure MakeGridOnControl(AGridImage: TImage; AHostImage: TImage; GridXSize, GridYSize: integer);
var
i, j, a, b: integer;
Rc, Gc, Bc: integer;
C: TColor;
begin
if not Assigned(AGridImage) then
Exit;


if not Assigned(AHostImage) then
Exit;


if GridXSize <= 0 then
GridXSize := 1;


if GridYSize <= 0 then
GridYSize := 1;


AGridImage.Picture := nil;
AGridImage.BringToFront;
AGridImage.AutoSize := False;
AGridImage.SetBounds(AHostImage.Left, AHostImage.Top, AHostImage.Width, AHostImage.Height);
AGridImage.Canvas.Brush.Color := clWhite;
AGridImage.Canvas.FillRect(AGridImage.ClientRect);
AHostImage.Hide;


j := GridYSize;
while j < AGridImage.Height do
begin


i := GridXSize;
while i < AGridImage.Width do
begin
Rc := 0;
Gc := 0;
Bc := 0;


for a := 1 to GridXSize do
for b := 1 to GridYSize do
begin
C := AHostImage.Canvas.Pixels[i -a +1, j -b +1];
Rc := Rc + GetRValue(C);
Gc := Gc + GetGValue(C);
Bc := Bc + GetBValue(C);
end;


Rc := round(Rc / GridXSize / GridYSize);
Gc := round(Gc / GridXSize / GridYSize);
Bc := round(Bc / GridXSize / GridYSize);


C := RGB(Rc, Gc, Bc);


AGridImage.Canvas.Brush.Color := C;
AGridImage.Canvas.FillRect(Rect(i -GridXSize, j -GridYSize, i, j));


inc(i, GridXSize);
end;


inc(j, GridYSize);
end;
end;




مثال:


MakeGridOnControl(Image1, Image2, 4, 4);


نمونه:

pandco
دوشنبه 15 اردیبهشت 1393, 17:09 عصر
با تشكر از استاد ارجمند مدير بخش

هر دو كد به دردم خورد فقط كد آخري كار نميكنه عكس نهايي رو سفيد مياره .

بي زحمت 2 سوال ديگه دارم :
1- بعد از اينكه عكس تبديل شد چطوري ميتونم به فرمت عكس ذخيرش كنم ؟

2- چطوري ميتونم عكس ورودي رو اول مثلا سايزش رو 2 برابر كنم بعد گريد رو اعمال كنم ؟

ممنون

coderinnetwork
سه شنبه 16 اردیبهشت 1393, 00:07 صبح
از تصویرتون تبدیل DCT بگیرید و از ماتریس تبدیل یافته فقط مولفه DC اونو نگه دارید

pandco
سه شنبه 16 اردیبهشت 1393, 11:18 صبح
در مورد DCT میشه بیشتر توضیح بدین ؟

ممنون

pandco
پنج شنبه 18 اردیبهشت 1393, 09:59 صبح
با سلام خدمت دوستان و اساتيد

چطوري ميتونم دو عكس رو با هم مرج كنم ؟

-------------------------------------------------

procedure MakeGridOnControl(AGridImage: TImage; AHostImage: TImage; GridXSize, GridYSize: integer);
var
i, j, a, b: integer;
Rc, Gc, Bc: integer;
C: TColor;
begin
if not Assigned(AGridImage) then
Exit;


if not Assigned(AHostImage) then
Exit;


if GridXSize <= 0 then
GridXSize := 1;


if GridYSize <= 0 then
GridYSize := 1;


AGridImage.Picture := nil;
AGridImage.BringToFront;
AGridImage.AutoSize := False;
AGridImage.SetBounds(AHostImage.Left, AHostImage.Top, AHostImage.Width, AHostImage.Height);
AGridImage.Canvas.Brush.Color := clWhite;
AGridImage.Canvas.FillRect(AGridImage.ClientRect);
AHostImage.Hide;


j := GridYSize;
while j < AGridImage.Height do
begin


i := GridXSize;
while i < AGridImage.Width do
begin
Rc := 0;
Gc := 0;
Bc := 0;


for a := 1 to GridXSize do
for b := 1 to GridYSize do
begin
C := AHostImage.Canvas.Pixels[i -a +1, j -b +1];
Rc := Rc + GetRValue(C);
Gc := Gc + GetGValue(C);
Bc := Bc + GetBValue(C);
end;


Rc := round(Rc / GridXSize / GridYSize);
Gc := round(Gc / GridXSize / GridYSize);
Bc := round(Bc / GridXSize / GridYSize);


C := RGB(Rc, Gc, Bc);


AGridImage.Canvas.Brush.Color := C;
AGridImage.Canvas.FillRect(Rect(i -GridXSize, j -GridYSize, i, j));


inc(i, GridXSize);
end;


inc(j, GridYSize);
end;
end;

وقتي از كد بالا استفاده ميكنم تصوير نهايي رو سفيد مياره ؟

ممنون