PDA

View Full Version : مشکل در زوم کردن روی عکس



javad2000
جمعه 21 دی 1386, 21:24 عصر
سلام
من یه عکس خیلی کوچیک سیاه سفید دارم (4*4 پیکسل) که یه نمونه بزرگ شده از اون رو اینجا می بینید:

http://aycu23.webshots.com/image/40062/2003661998582488927_rs.jpg (http://allyoucanupload.webshots.com/v/2003661998582488927)

میخوام این عکس رو داخل یه PictureBox که مولفه SizeMode اون روی Stretched تنظیم شده نمایش بدم. طبیعتاً انتظار دارم تصویری که نشون داده میشه، بزرگتر از تصویر خود عکس و چیزی شبیه این باشه:
http://aycu40.webshots.com/image/38319/2003669660065646667_rs.jpg (http://allyoucanupload.webshots.com/v/2003669660065646667)

اما اینطور نیست و اینجوری نمایش داده میشه:
http://aycu19.webshots.com/image/37978/2003648135384811145_rs.jpg (http://allyoucanupload.webshots.com/v/2003648135384811145)

چطور می تونم این مشکل رو حل کنم؟
با سپاس فراوان

__H2__
شنبه 22 دی 1386, 15:10 عصر
سلام
کلاً در همه نرم افزارها بزرگ کردن تصویر با کاهش کیفیت همراه است.
با دستورات پیچیده تر +GDI و با کمک مشخصه SmoothingMode و PixelOffsetMode میتوانید ترسیم خیلی بهتری داشته باشید ولی باز به شکل دوم خودتان نخواهید رسید.!
راه اصولی نیست ....

البته اگر شکل به همین سادگی باشد، اصلاً خیلی راحت تر خواهد بود که با دستورات ترسیمی مستقیماً در runtime رسمش کنید.

ولی کلاً و برای هر تصویری پیشنهاد میکنم در منبع برنامه تصویر را با وضوح بالا نگاه دارید و روی کوچک کردن آن در زمان لزوم حساب کنید نه بزرگ کردن آن !

javad2000
یک شنبه 23 دی 1386, 00:03 صبح
سلام
کلاً در همه نرم افزارها بزرگ کردن تصویر با کاهش کیفیت همراه است.
با دستورات پیچیده تر +GDI و با کمک مشخصه SmoothingMode و PixelOffsetMode میتوانید ترسیم خیلی بهتری داشته باشید ولی باز به شکل دوم خودتان نخواهید رسید.!
راه اصولی نیست ....

البته اگر شکل به همین سادگی باشد، اصلاً خیلی راحت تر خواهد بود که با دستورات ترسیمی مستقیماً در runtime رسمش کنید.

ولی کلاً و برای هر تصویری پیشنهاد میکنم در منبع برنامه تصویر را با وضوح بالا نگاه دارید و روی کوچک کردن آن در زمان لزوم حساب کنید نه بزرگ کردن آن !

با تقدیر از پاسخ شما
اجازه بدید سوال رو یه جور دیگه بپرسم:

من میخوام وقتی تصاویر سیاه سفید وارد PictureBox می کنم برای Strech کردن اونها، پیکسل های رنگی قاطی تصویر نکنه. در واقع کار من در اون PictureBox فقط با تصاویرسیاه سفید هست. چطور امکان داره که بهش حالی کنم پیکسل رنگی قاطی تصویر نکنه؟

با تشکر

__H2__
دوشنبه 24 دی 1386, 13:42 عصر
سلام مجدد
متاسفانه در دات نت میتوان تصویر با فرمت های مختلف پیکسلی ساخت ولی خیلی از اعمال مرسوم را دیگر نمی توان روی آنها صورت داد. (مثل فرمت های Index شده)

دو تابع زیر به همین منظور خاص مشکل شما نوشته شده اند.
که یک تصویر میگیرند و تغییر ابعاد پیدا کرده اش را برمیگردانند.
یعنی باید قبل از ریختن داخل picturebox تصویر را تحویل این توابع دهید و خروجی را به picturebox بدهید.


Public Shared Function GrayResize1(ByVal image As System.Drawing.Image, ByVal iWidth As Integer, ByVal iHeight As Integer) As System.Drawing.Image
Dim ret As New System.Drawing.Bitmap(iWidth, iHeight)

Using graphic As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(ret)
graphic.DrawImage(image, 0, 0, iWidth, iHeight)
End Using

Return ret
End Function




Public Shared Function GrayResize2(ByVal image As System.Drawing.Image, ByVal iWidth As Integer, ByVal iHeight As Integer) As System.Drawing.Image
Dim ret As New System.Drawing.Bitmap(iWidth, iHeight, System.Drawing.Imaging.PixelFormat.Format16bppRgb5 55)

Using graphic As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(ret)
graphic.CompositingQuality = Drawing2D.CompositingQuality.HighSpeed
graphic.CompositingMode = Drawing2D.CompositingMode.SourceCopy
graphic.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighSpeed
graphic.SmoothingMode = Drawing2D.SmoothingMode.HighSpeed
graphic.InterpolationMode = Drawing2D.InterpolationMode.Low

Using att As New System.Drawing.Imaging.ImageAttributes
att.SetOutputChannel(Imaging.ColorChannelFlag.Colo rChannelK)
graphic.DrawImage(image, New System.Drawing.Rectangle(0, 0, iWidth, iHeight), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, att)
End Using
End Using

Return ret
End Function

ببینید یکی از این دو مشکلتان را حل میکند.