ورود

View Full Version : اسکن در پیکجرباکس



elmira_63
سه شنبه 04 تیر 1387, 08:15 صبح
سلام دوستان
من توی برنامم از برنامه زیر برای اسکن کردن عکس استفاده می کنم درست جواب میده بهم ولی من میخوام به جای این که توی یه فرم دیگه این عکس رو بیاره , توی یه picturebox بیاره برام
خودم هر چی فکر کردم متوجه نشدم چه جوری این عکس رو توی فرم لود کرده اگه کسی میدونه راهنماییم کنه ممنون می شم

elmira_63
سه شنبه 04 تیر 1387, 08:52 صبح
من فکر کنم توی این قسمت عکس وارد فرم می شه اگه اشتباه نکرده باشم حالا نمی دونم چه طور این عکس رو به یه picturebox نسبت بدم؟؟؟؟؟


Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
Dim cltrect As Rectangle = ClientRectangle
Dim clprect As Rectangle = e.ClipRectangle
Dim scrol As Point = AutoScrollPosition
Dim realrect As Rectangle = clprect

realrect.X -= scrol.X
realrect.Y -= scrol.Y

Dim brbg As SolidBrush = New SolidBrush(Color.Black)
If (realrect.Right > bmprect.Width) Then
Dim bgri As Rectangle = clprect
Dim ovri As Integer = bmprect.Width - realrect.X
If (ovri > 0) Then
bgri.X += ovri
bgri.Width -= ovri
End If
e.Graphics.FillRectangle(brbg, bgri)
End If

If (realrect.Bottom > bmprect.Height) Then
Dim bgbo As Rectangle = clprect
Dim ovbo As Integer = bmprect.Height - realrect.Y
If (ovbo > 0) Then
bgbo.Y += ovbo
bgbo.Height -= ovbo
End If
e.Graphics.FillRectangle(brbg, bgbo)
End If

realrect.Intersect(bmprect)
If Not (realrect.IsEmpty) Then
Dim bot As Integer = bmprect.Height - realrect.Bottom
Dim hdc As IntPtr = e.Graphics.GetHdc()
SetDIBitsToDevice(hdc, clprect.X, clprect.Y, realrect.Width, realrect.Height, realrect.X, bot, 0, bmprect.Height, pixptr, bmpptr, 0)
e.Graphics.ReleaseHdc(hdc)

End If
End Sub

saeed_rezaei
جمعه 07 تیر 1387, 22:08 عصر
سلام
عملیات دریافت تصویر و انتقال آن به حافظه قبلا انجام شده است. در این قطعه کد که شما نوشتید، اشاره گری از فرم جدید به همراه اشاره گری از حافظه ای که عکس در ان ذخیره می شود به همراه سایر اطلاعات نظیر محدوده تصویر و ... به SetDIBitsToDevice ارسال می شه تا تصویر رو رسم کنه.
برای اینکه مشکلتون حل شه شما باید از همین تابع استفاده کنید، و البته اونجایی که یه اشاره گر از جنس فرم بهش میدی، یه اشاره گر از جنس فایل بهش بدی.
خوب اجازه بدید با استفاده از کد توضیح بدم.
این قسمت از آخر تکه کدتون رو در نظر بگیرید:



If Not (realrect.IsEmpty) Then
Dim bot As Integer = bmprect.Height - realrect.Bottom
Dim hdc As IntPtr = e.Graphics.GetHdc()
SetDIBitsToDevice(hdc, clprect.X, clprect.Y, realrect.Width, realrect.Height, realrect.X, bot, 0, bmprect.Height, pixptr, bmpptr, 0)
e.Graphics.ReleaseHdc(hdc)

End If



این قسمت رو به صورت زیر تصحیح کنید.



IfNot (realrect.IsEmpty) Then
Dim bot AsInteger = bmprect.Height - realrect.Bottom
Dim hdc As IntPtr = e.Graphics.GetHdc()

Dim bmp AsNew Bitmap(realrect.Width, realrect.Height)
Dim eee As Graphics = Graphics.FromImage(b)
Dim hdc2 As IntPtr = eee.GetHdc()

SetDIBitsToDevice(hdc, clprect.X, clprect.Y, realrect.Width, realrect.Height, realrect.X, bot, 0, bmprect.Height, pixptr, bmpptr, 0)
SetDIBitsToDevice(hdc2, clprect.X, clprect.Y, realrect.Width, realrect.Height, realrect.X, bot, 0, bmprect.Height, pixptr, bmpptr, 0)

e.Graphics.ReleaseHdc(hdc)
eee.ReleaseHdc(hdc2)
bmp.Save("f:\eee.jpg", Imaging.ImageFormat.Jpeg)
EndIf


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



picturebox1.image=bmp


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

elmira_63
شنبه 08 تیر 1387, 08:17 صبح
ممنون آقای saeed_rezaei
من وقتی دیدم کسی جوابی نداد اومدم یه کلید گذاشتم برای ذخیره عکس از فرم بر روی هارد و یه کلید دیگه برای باز کردن اون عکس توی picturebox که به نظر خودم این کار اوصولی نبود
حالا کدی که شما گفته بودید رو اضافه کردم ولی این خط رو err می گیره اگه ممکنه برام توضیح بدید این b چیه و کجا مقدار می گیره؟؟؟؟

Dim eee As Graphics = Graphics.FromImage(b)

بعدم هر جا صحبت از اسکن و اسکن کردن شده یه برنامه آماده گذاشته شده که می تونید برای این کار از این تکه کد استفاده کنید , حالا اگه وقتشو دارید و مقدوره مکانیزم کار اسکن رو بیشتر توضیح بدین که اصلا برای اسکن کردن چه کارایی لازمه انجام بشه و کدوم قسمت از برنامه بالا این کار رو انجام میده...

saeed_rezaei
یک شنبه 09 تیر 1387, 12:51 عصر
سلام
وای وای وای
عذر می خوام
توی ویرایش آخرم اشتباهی نوشتم.
b رو عوض کنید به bmp
این تیکه کدی که من بهتون دادم روی کدهای قبلی سوار می شه. بهتون پیشنهاد می کنم برای اینکه بعدا توی برنامه مشکل منطقی پیش نیاد حتما کدهاتون رو تصحیح کنید. اصل کدها رو از برنامه نمونه بگیرید و توی برنامه خودتون پیاده کنید.