الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

دمج الصور

مغلق
بدأه عبد القادر طفي في 29 ديسمبر 2001 · 18 رد · 1,660 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

مرحبا يا أصدقاء

موضوع أنا بحاجة ملحة له

كيف أقوم بدمج صورتين بدلفي

علما أنني أقوم بالرسم عليهما من خلال Canvas

والصورة الثانية ليس لها أرضية

ولج جزيل الشكر

Super Nova

#2

اخي العزيز

مع اني لم افهم المقصود تماما لكن ساعطيك البرنامج التالي الدي يقوم بتكوين صورتين واحدة امامية و الاخري كخلفية لها ,

حيت الصورة الاولى اسمها h1 وهي الخلفية للصورة التانية H2 حيت يشرط في الصورة التانية H2 ان تحتوي على صورة اصغر من الصورة H1

وتكون دات خلفية بيضا ,

ضع الاوامر التالية داخل FORM جديدة , و ما عليك فقط الا ان تقوم ب

1- ربط احدت oncreate الخاص بالفورم

2- ضع صورتين في نفس الدليل الدي كونت به البرنامج و سمهم h1 , h2 .

فقط وسوف يشتغل الكود بادن الله

unit Unit1;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
  public
  ImageForeGround: TImage;
    ImageBackGround: TImage;
    { Public declarations }
  end;

procedure DrawTransparentBitmap (ahdc: HDC;
                                 Image: TImage;
                                 xStart, yStart: Word);

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure DrawTransparentBitmap (ahdc: HDC;
                                 Image: TImage;
                                 xStart, yStart: Word);
var
  TransparentColor: TColor;
  cColor          : TColorRef;
  bmAndBack,
  bmAndObject,
  bmAndMem,
  bmSave,
  bmBackOld,
  bmObjectOld,
  bmMemOld,
  bmSaveOld       : HBitmap;
  hdcMem,
  hdcBack,
  hdcObject,
  hdcTemp,
  hdcSave         : HDC;
  ptSize          : TPoint;
begin
{ set the transparent color to be the lower left pixel of the bitmap
}
TransparentColor := Image.Picture.Bitmap.Canvas.Pixels[0,
  Image.Height - 1];
TransparentColor := TransparentColor or $02000000;

hdcTemp := CreateCompatibleDC (ahdc);
SelectObject (hdcTemp, Image.Picture.Bitmap.Handle); { select the bitmap }

{ convert bitmap dimensions from device to logical points
}
ptSize.x := Image.Width;
ptSize.y := Image.Height;
DPtoLP (hdcTemp, ptSize, 1);  { convert from device logical points }

{ create some DCs to hold temporary data
}
hdcBack   := CreateCompatibleDC(ahdc);
hdcObject := CreateCompatibleDC(ahdc);
hdcMem    := CreateCompatibleDC(ahdc);
hdcSave   := CreateCompatibleDC(ahdc);

{ create a bitmap for each DC
}

{ monochrome DC
}
bmAndBack   := CreateBitmap (ptSize.x, ptSize.y, 1, 1, nil);
bmAndObject := CreateBitmap (ptSize.x, ptSize.y, 1, 1, nil);

bmAndMem    := CreateCompatibleBitmap (ahdc, ptSize.x, ptSize.y);
bmSave      := CreateCompatibleBitmap (ahdc, ptSize.x, ptSize.y);

{ each DC must select a bitmap object to store pixel data
}
bmBackOld   := SelectObject (hdcBack, bmAndBack);
bmObjectOld := SelectObject (hdcObject, bmAndObject);
bmMemOld    := SelectObject (hdcMem, bmAndMem);
bmSaveOld   := SelectObject (hdcSave, bmSave);

{ set proper mapping mode
}
SetMapMode (hdcTemp, GetMapMode (ahdc));

{ save the bitmap sent here, because it will be overwritten
}
BitBlt (hdcSave, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);

{ set the background color of the source DC to the color.
  contained in the parts of the bitmap that should be transparent
}
cColor := SetBkColor (hdcTemp, TransparentColor);

{ create the object mask for the bitmap by performing a BitBlt()
  from the source bitmap to a monochrome bitmap
}
BitBlt (hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);

{ set the background color of the source DC back to the original color
}
SetBkColor (hdcTemp, cColor);

{ create the inverse of the object mask
}
BitBlt (hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, NOTSRCCOPY);

{ copy the background of the main DC to the destination
}
BitBlt (hdcMem, 0, 0, ptSize.x, ptSize.y, ahdc, xStart, yStart, SRCCOPY);

{ mask out the places where the bitmap will be placed
}
BitBlt (hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND);

{ mask out the transparent colored pixels on the bitmap
}
BitBlt (hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND);

{ XOR the bitmap with the background on the destination DC
}
BitBlt (hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCPAINT);

{ copy the destination to the screen
}
BitBlt (ahdc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, 0, 0, SRCCOPY);

{ place the original bitmap back into the bitmap sent here
}
BitBlt (hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcSave, 0, 0, SRCCOPY);

{ delete the memory bitmaps
}
DeleteObject (SelectObject (hdcBack, bmBackOld));
DeleteObject (SelectObject (hdcObject, bmObjectOld));
DeleteObject (SelectObject (hdcMem, bmMemOld));
DeleteObject (SelectObject (hdcSave, bmSaveOld));

{ delete the memory DCs
}
DeleteDC (hdcMem);
DeleteDC (hdcBack);
DeleteDC (hdcObject);
DeleteDC (hdcSave);
DeleteDC (hdcTemp);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
{ create image controls for two bitmaps and set their parents
}
ImageForeGround := TImage.Create (Form1);
ImageForeGround.Parent := Form1;
ImageBackGround := TImage.Create (Form1);
ImageBackGround.Parent := Form1;

{ load images
}
ImageBackGround.Picture.LoadFromFile ('h1.bmp');
ImageForeGround.Picture.LoadFromFile ('h2.bmp');

{ set background image size to its bitmap dimensions
}
with ImageBackGround do
  begin
  Left := 0;
  Top := 0;
  Width := Picture.Width;
  Height := Picture.Height;
  end;

{ set the foreground image size centered in the background image
}
with ImageForeGround do
  begin
  Left := (ImageBackGround.Picture.Width - Picture.Width) div 2;
  Top := (ImageBackGround.Picture.Height - Picture.Height) div 2;
  Width := Picture.Width;
  Height := Picture.Height;
  end;

{ do not show the transparent bitmap as it will be displayed (BitBlt()ed)
  by the DrawTransparentBitmap() function
}
ImageForeGround.Visible := False;

{ draw the tranparent bitmap
  note how the DC of the foreground is used in the function below
}
DrawTransparentBitmap (ImageBackGround.Picture.Bitmap.Canvas.Handle, {HDC}
                       ImageForeGround, {TImage}
                       ImageForeGround.Left, {X}
                       ImageForeGround.Top {Y} );
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
{ free images
}
ImageForeGround.Free;
ImageBackGround.Free;
end;

end.

وشكرا

لقد قمت بتعديل الكود ليظهر بصورة صحيحة ولم أغير فيه أى شيئ (((رمضان)))

madi

#3

شكرا لك يا أخ Madi

بصراحة أنا أقوم ببناء برنامج رسم لة مواصفات معينة وهو شبية نوعا ما ببرامج الهواتف الخلوية التي تصنع Logo

والمشكلة الأهم في الموضوع هو الرسم في وضع التكبير Zoom أرجو أن اكون قد وضحت الفكرة

Super Nova

#4

مرحبا لقد تمت جميع العمليات بنجاح ما عدى الرسم على اللوحة في وضعيت الزوم

فهل لدى أحدكم أي فكرة ممكن يفيدني بها

(f)

Super Nova

#5

hello,

I think you need to deal with BitBlt() API function, and you can

find an explanasion about it in MSDN or API help file which come with Delphi.

thanks

#6

ياريت يا اخي العزيز توطح المطلوب اكتر , وياريت توضح العمليات التي تمت بنجاح لكي يستفيد منها الجميع و ايضا لكي نفهم نحن البرنامج فنستطيع التوضيح اكتر .

وشكرا

#7

البرامج مبنية ب دلفي 6

هذا هو أول برنامج

http://toffi.4t.com/Draw/Drawing.zip

هذا هو الثاني

http://toffi.4t.com/Draw/drawing%201.zip

هذا هو البرنامج اللذي اريد أن اضيف امكانيات الرسم الموجودة به على برنامجي

http://toffi.4t.com/Draw/toffi.zip

1.jpg

2.jpg

Super Nova

#8

يبدو انو ما حدا لحدا هي الأيام

Super Nova

#9

السلام عليكم

الاخ عبد القادر

لا يأس مع الحياة و لا حياة مع اليأس .

أخي الفترة فترة اختبارات و الاخوة اغلبهم مشغول .:)

اود ان اساعد - ان استطعت ذلك- لكن لم استطع تنزيل البرامج التي وضعتها(حاولت عدة مرات) . تأكد من الارتباطات ;)

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#10

اخي العزيز

لاسف الوصلات ما اشتغلت , كنت فاكر ان المشكلة من عندي لاني كنت اعاني شوية مشاكل في الانترنت ( بطء كبير لدرجة الغليان) .

لكن الباين المشكلة من الوصلة , حاول مرة تانية وان شا الله تعالى كلنا حنساعدك .

وشكرا

madi

#11

الوصلات شغالة من عندي وأنا عيطي هي الصلاحية من خلال غرفت التحكم في الموقع على كل حال جربتو الضغط بزر الماوس الأيمن على الوصلة واختيار حفظ اهدف

اذا ما شتغلو ياريت تخبروني

Super Nova

#12

السلام عليكم

اخي الكريم

نحن نعلم كيف نقوم بعملية download :). المشكلة في الوصلات فعلا .

الم تلاحظ ان الصور التي عملت لها ارتباط هنا لا تظهر مثل

http://toffi.4t.com/Draw/1.jpg

اخي الكريم تاكد من الوصلات :) . منتظرين علــى نار (حتى ما تقول يبدو انو ما حدا لحدا هي الأيام :confused: :confused: :confused: ).

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#13

اخي العزيز , نحن لم نتاخر عليك , لكن المطلوب غير واضح ,

عموما اليك هده الطريقة لتكبير و تصغير الصور مع متال لطريقة استخدامها . ضع Image و زر على الفروم , حمل صورة داخل Image

واكتب الكود التالي .

procedure ResizePicture(Mainp:Timage;xmax,ymax:integer);

    var MainpX,MainpY,FormY,FormX,a,b,Faktor:Real;

    begin

    mainp.stretch := False;

    mainp.autosize := True;

    mainp.stretch := true;

    mainp.autosize := false;

    a := mainp.Width / xmax;

    b := mainp.Height / ymax;

    MainpX := Mainp.width;

    MainpY := Mainp.height;

    FormX := xmax;

    FormY := ymax;

    If a >= b Then

    Begin

    faktor := mainpX / FormX;

    mainpX := FormX;

    mainpY := mainpY / faktor;

    End;

    If a < b Then

    Begin

    Faktor := mainpY / FormY;

    mainpY := FormY;

    mainpX := mainpX / faktor;

    End;

    Mainp.width:=Trunc(MainpX);

    Mainp.height:=Trunc(MainpY);

    end;





procedure TForm1.Button1Click(Sender: TObject);

begin

ResizePicture(image1,100,100);

end;

وشكرا

madi

#15

اخي العزيز للاسف , لم ينزل البرنامج , ويطلب في اسم مستخدم وكلمة سر .

ياريت اخي العزيز تشرح بالتفصيل الممل المطلوب في برنامجك , وتحاول تعديل الوصلة او تحاول تحميل الملف في مكان اخر متلا أين

وشكرا

مــــMADIــــدي

#16

شكرا لكم جميعا أخواني الكرام

وأخص بالشكر الاستاذ عبد الودود مرعشي (f)

Super Nova

#17

أخي عبد القادر

لا شكر على واجب

ولكن إذا ما عندك مانع أن تضع الفكرة النهائية في المنتدى لتعم الفائدة على الجميع

والسلام عليكم

:o

#18

الفكرة ببساطة أننا قمنا بوضع هداة Image عدد 2 الأولى بالحجم الأصلي وهو صغير بوعا ما والثانية بالحجم المضاعف وكانت نسبت التكبير لدي هي ثمانية مرات

عند عملية الرسم على الصورة الثانية طبعا في الحدث "ماوس موف" نرسم على الصوره الأولى بنفس الأحداثيات ولكن تقسيم 8 وبعد ذالك نمسح الصوره الثانية ونجعاها تأخذ صورتها من الصورة الأولى عبر التابع

StretchBlt (image2.Canvas.Handle,0,0,576,256,image1.Canvas.Handle,0,0,72,32,$CC0020);

وغن شاء الله بكون كلي شيء تمام

Super Nova

#19

أخي العزيز , وجدت لك هدا الكود الدي قد يفيدك .

فقط ضع Image على الفورم سمه Display .

تم ستحتاج الى المتغيرات الخارجية

 

var

 	 Form1: TForm1;

	LastX,LastY:Integer;

const

	ZOOM_RECT=30;

    DoZoomIn:Boolean=False;

وايضا سوف تحتاج للتعامل مع الاحدات التالية

FormCreate الخاص بالفورم

DisplayMouseMove الخاص با Image

DisplayMouseUp الخاص با Image

وستحتاج الى تعريف الاجراء

DrawMandelbrot

الان اليك الكود كاملا

 





interface



uses

	Graphics, Forms, ExtCtrls, Controls, Classes,

    MandelbrotExplorerProcs;



type

  TForm1 = class(TForm)

    Display: TImage;

    procedure FormCreate(Sender: TObject);

    procedure ResetDisplay;

    procedure DrawMandelbrot;

    procedure DisplayMouseMove(Sender: TObject; Shift: TShiftState; X,

      Y: Integer);

    procedure DisplayMouseUp(Sender: TObject; Button: TMouseButton;

      Shift: TShiftState; X, Y: Integer);

  private

    { Private declarations }

  public

    { Public declarations }

  end;



var

 	 Form1: TForm1;

	LastX,LastY:Integer;

const

	ZOOM_RECT=30;

    DoZoomIn:Boolean=False;



implementation



{$R *.DFM}







procedure TForm1.FormCreate(Sender: TObject);

begin

{Initialize scaling}

    DisplayWidth:=Display.Width;

    DisplayHeight:=Display.Height;

    MinX:=-2.2; MaxX:=0.5;

    MinY:=-1.35;  MaxY:=1.35;

    Rescale;

{Reset Display}

    ResetDisplay;

{Reset the palette}

   FillChar(MandelbrotPalette,SizeOf(MandelbrotPalette),0);

  MandelbrotPalette[MB_MAX]:=clWhite;

end;



procedure TForm1.ResetDisplay;

begin

  with Display.Canvas do begin

   	 Brush.Color:=clBlack;

        Brush.Style:=bsSolid;

        FillRect(Display.ClientRect);

    end;

	Display.Refresh;

end;



procedure TForm1.DrawMandelbrot;

var i,j,C:Integer;

	X,Y:Real;

begin

	if DoZoomIn then Exit;

	for i:=1 to Display.Height do begin

   	 for j:=1 to Display.Width do begin

 	 X:=ScreenToPlane(j,True);

      Y:=ScreenToPlane(i,False);

       	 C:=CheckMandelbrot(X,Y);

       	 Display.Canvas.Pixels[j,i]:=MandelbrotPalette[C];

        end;

        Display.Invalidate;

        Application.ProcessMessages;

        if (Application.Terminated) then Break;

    end;

    DoZoomIn:=True;

    LastX:=-200;

    LastY:=-200;

end;





procedure TForm1.DisplayMouseMove(Sender: TObject; Shift: TShiftState;

  X, Y: Integer);

begin

	if DoZoomIn then with Display.Canvas do begin

  Pen.Style:=psSolid;

        Pen.Mode:=pmNot;

        Brush.Style:=bsClear;

        Rectangle(LastX-ZOOM_RECT,LastY-ZOOM_RECT,LastX+ZOOM_RECT,LastY+ZOOM_RECT);

        LastX:=X;LastY:=Y;

  Rectangle(LastX-ZOOM_RECT,LastY-ZOOM_RECT,LastX+ZOOM_RECT,LastY+ZOOM_RECT);

  Pen.Mode:=pmCopy;

    end;

end;



procedure TForm1.DisplayMouseUp(Sender: TObject; Button: TMouseButton;

  Shift: TShiftState; X, Y: Integer);

begin

	if Tag=0 then begin

   	 DrawMandelbrot;

        Tag:=1;

    end else

    if Button=mbRight then begin

   	 MakeMandelbrotPalette;

  DoZoomin:=False;

        DrawMandelbrot;

    end else

	if DoZoomIn then begin

        Display.Canvas.Rectangle(LastX-ZOOM_RECT,LastY-ZOOM_RECT,LastX+ZOOM_RECT,LastY+ZOOM_RECT);

        MinX:=ScreenToPlane(LastX-ZOOM_RECT,True);

        MinY:=ScreenToPlane(LastY+ZOOM_RECT,False);

        MaxX:=ScreenToPlane(LastX+ZOOM_RECT,True);

        MaxY:=ScreenToPlane(LastY-ZOOM_RECT,False);

        Rescale;

        DoZoomIn:=False;

        ResetDisplay;

        DrawMandelbrot;

	end;

end;



end.

وشكرا

مــــMADIــــدي

هذا الموضوع مغلق.

مواضيع مشابهة