View Full Version : سوال: طریقه شطرنجی کردن عکس جهت نقشه فرش در قالیبافی ؟
  
pandco
چهارشنبه 10 اردیبهشت 1393, 18:42 عصر
با سلام خدمت دوستان
چطور میتونم یه عکس رو در دلفی به  صورت شطرنجی در بیارم که تو قالیبافی استفاده بشه ؟ (مانند عکس های زیر)
ممنون 
118508
یوسف زالی
چهارشنبه 10 اردیبهشت 1393, 20:04 عصر
سلام.
گرید رو در یک لایه جداگانه روش draw کنید.
کجاش مشکله؟
rahnema1
چهارشنبه 10 اردیبهشت 1393, 21:49 عصر
توی سی شارپ این جا توضیح داده شده:
http://barnamenevis.org/showthread.php?448691
hadisalahi2
پنج شنبه 11 اردیبهشت 1393, 11:23 صبح
کامپوننت imageEN و Envision همچین فیلترهایی رو به تصویر اعمال میکنند
خیلی ساده و فقط با یک خط دستور
pandco
شنبه 13 اردیبهشت 1393, 17:45 عصر
ممنون از توجه دوستان ارجمند 
(گرید رو در یک لایه جداگانه روش draw کنید. ) امکانش هست زحمت بکشید کمی بیشتر توضیح بدید (یا کدی مشابه قرار بدید)چون کاربر معمولی هستم.
rahnema1
یک شنبه 14 اردیبهشت 1393, 18: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, 18: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, 19: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, 18:09 عصر
با تشكر از استاد ارجمند مدير بخش
هر دو كد به دردم خورد فقط  كد آخري كار نميكنه عكس نهايي رو سفيد مياره .
بي زحمت 2 سوال ديگه دارم :
1- بعد از اينكه عكس تبديل شد چطوري ميتونم به فرمت عكس ذخيرش كنم ؟
2- چطوري ميتونم عكس ورودي رو اول مثلا سايزش رو 2 برابر كنم بعد گريد رو اعمال كنم ؟
ممنون
coderinnetwork
سه شنبه 16 اردیبهشت 1393, 01:07 صبح
از تصویرتون تبدیل DCT بگیرید و از ماتریس تبدیل یافته فقط مولفه DC اونو نگه دارید
pandco
سه شنبه 16 اردیبهشت 1393, 12:18 عصر
در مورد DCT میشه بیشتر توضیح بدین ؟
ممنون
pandco
پنج شنبه 18 اردیبهشت 1393, 10: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;
وقتي از كد بالا استفاده ميكنم تصوير نهايي رو سفيد مياره ؟
ممنون
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.