PDA

View Full Version : مبتدی: کوچک کردن سایز عکس بدون تغییر کیفیت



asefy2008
یک شنبه 16 اسفند 1388, 22:59 عصر
سلام دوستان
فکر کنم عنوان کاملا گویاست می خوام یه عکس رو کوچک کنم با تبدیل wavelet چطور باید این کار رو انجام بدم ؟(البته چون داره عکس کوچک میشه کیفیت تغییر نمیکنه)
در صورت امکان با کد راهنمایی کنید.

AliRezaPro
دوشنبه 17 اسفند 1388, 08:16 صبح
عکس وقتی کوچیک میشه ، کیفیت اون بهتر میشود

public Bitmap ResizeBitmap( Bitmap b, int nWidth, int nHeight )
{
Bitmap result = new Bitmap( nWidth, nHeight );
using( Graphics g = Graphics.FromImage( (Image) result ) )
g.DrawImage( b, 0, 0, nWidth, nHeight );
return result;
}

asefy2008
چهارشنبه 25 فروردین 1389, 10:18 صبح
عکس وقتی کوچیک میشه ، کیفیت اون بهتر میشود

public Bitmap ResizeBitmap( Bitmap b, int nWidth, int nHeight )
{
Bitmap result = new Bitmap( nWidth, nHeight );
using( Graphics g = Graphics.FromImage( (Image) result ) )
g.DrawImage( b, 0, 0, nWidth, nHeight );
return result;
}
ممنون دوست عزيز از راهنمايتون اما اين كد يك برش از تصوير اصلي رو ميده ولي من مي خوام تصويرم با حفظ جزئيات كوچك بشه. در ضمن اين جواب با تبديل موجك نيست من مي خوام عكسم فشرده سازي بشه با تبديل موجك.

AliRezaPro
چهارشنبه 25 فروردین 1389, 11:58 صبح
ممنون دوست عزيز از راهنمايتون اما اين كد يك برش از تصوير اصلي رو ميده ولي من مي خوام تصويرم با حفظ جزئيات كوچك بشه. در ضمن اين جواب با تبديل موجك نيست من مي خوام عكسم فشرده سازي بشه با تبديل موجك.
سلام
تابع بدون مشکل عمل ریسایز رو روی کل عکس انجام میده و مشکلی نداره.
شاید من بد متوجه شدم.شما میخواهید عکس در همان سایز (اندازه) باشه ولی حجم اون رو کاهش دهید (یعنی می خواهید کامپرس کنید)بدون افت کیفیت؟یا همان ریسایز در رزولیشن بدون افت کیفیت؟

Marzieh_A
چهارشنبه 25 فروردین 1389, 12:03 عصر
این کد رو امتحان کنید



public Image resizeImage(Image imgToResize, Size size)
{
int sourceWidth = imgToResize.Width;
int sourceHeight = imgToResize.Height;
float nPercent = 0;
float nPercentW = 0;
float nPercentH = 0;
nPercentW = ((float)size.Width / (float)sourceWidth);
nPercentH = ((float)size.Height / (float)sourceHeight);
if (nPercentH < nPercentW)
nPercent = nPercentH;
else
nPercent = nPercentW;
int destWidth = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);
Bitmap b = new Bitmap(destWidth, destHeight);
Graphics g = Graphics.FromImage((Image)b);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
g.Dispose();
return (Image)b;
}

behnam25214
چهارشنبه 25 فروردین 1389, 12:17 عصر
دوست عزیز
در هر صورت اگه عکس رو کوچک یا بزرگ کنید کیفیت عکس پائین می آید.:لبخندساده:

asefy2008
چهارشنبه 25 فروردین 1389, 20:05 عصر
سلام
تابع بدون مشکل عمل ریسایز رو روی کل عکس انجام میده و مشکلی نداره.
شاید من بد متوجه شدم.شما میخواهید عکس در همان سایز (اندازه) باشه ولی حجم اون رو کاهش دهید (یعنی می خواهید کامپرس کنید)بدون افت کیفیت؟یا همان ریسایز در رزولیشن بدون افت کیفیت؟
نه من نمی خوام حجم رو کاهش بدم. یکم بیشتر توضیح میدم نگاه کن من یک عکس با سایز 100 در 100 پیکسل دارم می خوام این عکس رو به یک ماتریس 10 در 10 پیکسلی تبدیل کنم بدون تغییر در جزئیات یعنی نمی خوام جزئیات از تصویر حذف بشه


Marzieh_Aنقل قول: کوچک کردن سایز عکس بدون تغییر کیفیت
این کد رو امتحان کنید

کد:
publicImage resizeImage(Image imgToResize, Size size){int sourceWidth = imgToResize.Width;int sourceHeight = imgToResize.Height;float nPercent = 0;float nPercentW = 0;float nPercentH = 0;nPercentW = ((float)size.Width / (float)sourceWidth);nPercentH = ((float)size.Height / (float)sourceHeight);if (nPercentH < nPercentW)nPercent = nPercentH;elsenPercent = nPercentW;int destWidth = (int)(sourceWidth * nPercent);int destHeight = (int)(sourceHeight * nPercent);Bitmap b = newBitmap(destWidth, destHeight);Graphics g = Graphics.FromImage((Image)b);g.InterpolationMode = InterpolationMode.HighQualityBicubic;g.DrawImage(i mgToResize, 0, 0, destWidth, destHeight);g.Dispose();return (Image)b;}

میشه بگی این کد با کد دوستمون چه تفاوتی داره؟


behnam25214نقل قول: کوچک کردن سایز عکس بدون تغییر کیفیت
دوست عزیز
در هر صورت اگه عکس رو کوچک یا بزرگ کنید کیفیت عکس پائین می آید.:لبخندساده:

با این راه که من می خوام انجام بدم اگر تصویر کوچک بشه کیفیت بالا میره و همچنان جزئیات در تصویر وجود دارند.

Marzieh_A
چهارشنبه 25 فروردین 1389, 23:06 عصر
میشه بگی این کد با کد دوستمون چه تفاوتی داره؟



این دو تا کد با هم فرق دارن.
کدی که جناب man7tomani گذاشتن، دقیقا عرض و طول عکس رو برابر با مقدار داده شده می کته. یعنی کاری به ساختار کلی و شکل اصلی عکس نداره.
اما کدی که من گذاشتم عکس رو با در نظر گرفتن گزینۀ Keep aspect ratio که اکثر برنامه های ویرایش عکس دارند، resize می کنه.
البته بهتره بگم که عمل این خاصیت در resize کردن عکس اینه که عکس ورودی رو با در نظر گرفتن شکل کلی نسبت به size داده شده resize می کنه.
یعنی نسبت ابعاد به هم بعد قبل و بعد از resize شدن عکس مورد نظر، یکی هست.

AliRezaPro
چهارشنبه 25 فروردین 1389, 23:35 عصر
این دو تا کد با هم فرق دارن.
کدی که جناب man7tomani گذاشتن، دقیقا عرض و طول عکس رو برابر با مقدار داده شده می کته. یعنی کاری به ساختار کلی و شکل اصلی عکس نداره.
اما کدی که من گذاشتم عکس رو با در نظر گرفتن گزینۀ Keep aspect ratio که اکثر برنامه های ویرایش عکس دارند، resize می کنه.
البته بهتره بگم که عمل این خاصیت در resize کردن عکس اینه که عکس ورودی رو با در نظر گرفتن شکل کلی نسبت به size داده شده resize می کنه.
یعنی نسبت ابعاد به هم بعد قبل و بعد از resize شدن عکس مورد نظر، یکی هست.
سلام
من 1 عکس رو با هر دو تابع خروجی گرفتم اما خروجی ها کاملا مثل هم بود و هیچ تفاوتی نداشتند.

Marzieh_A
پنج شنبه 26 فروردین 1389, 00:12 صبح
سلام
من 1 عکس رو با هر دو تابع خروجی گرفتم اما خروجی ها کاملا مثل هم بود و هیچ تفاوتی نداشتند.
جالبه ...
لابد عکس و سایزی که دادید در هر دو تابع با وجود یا بدون وجود خاصیت Keep aspect ratio خروجی یکسان میده!
اما نتایجی که من گرفتم رو ببینید.
عکس اول، عکس اصلی هست.
عکس دوم با تابعی که شما نوشتید عکس رو به سایز با عرض 200 و طول 250 تبدیل می کنه.
عکس سوم با تابعی که من نوشتم و با سایز ورودی عرض 200 و طول 250، عکس رو resize می کنه.
به نظرتون هیچ فرقی تو نتایج نیست؟!!!



http://pic0.picsorlinks.com/ph_or_15245_a8ba140.jpg


http://pic0.picsorlinks.com/ph_or_15247_cb69cc5.jpg


http://pic0.picsorlinks.com/ph_or_15248_9b8ca16.jpg

aminghaderi
جمعه 28 خرداد 1389, 13:30 عصر
خوب این کد های که شما ها نوشتید به چه دردی می خوره؟!؟
من الان می خوام استفاده کنم،،،
خوب از این توابع چطوری باید استفاده کرد؟؟؟
اون retern چی رو بر می گردونه؟؟؟
تصویر Resize شده کجا ذخیره می شه؟؟؟؟
نیم اسپیس های مرتبط چی هست؟؟؟
ووو
برای کد زحمت کشیدید ولی چه فایده که کامل نیست؟!

asefy2008
جمعه 28 خرداد 1389, 20:02 عصر
خوب این کد های که شما ها نوشتید به چه دردی می خوره؟!؟
در پردازش تصویر بدرد می خوره. شما فرض کن بخوای یک عکس 200*200 رو پردازش کنی. حالا اگر شما بتونی همین عکس رو در اندازه 50*50 داشته باشی و نتیجه پردازش هم یکی باشه کدوم روش رو انتخاب می کنی ؟


خوب از این توابع چطوری باید استفاده کرد؟؟؟
در تابع پست 2 شما یک عکس به همراه اندازه جدیدش رو به تابع می فرستی و اون تابع همون عکس رو با اندازه داده شده بهت بر می گردونه .


اون retern چی رو بر می گردونه؟؟؟
عکس با اندازه جدید که شما به تابع میدی


برای کد زحمت کشیدید ولی چه فایده که کامل نیست؟!
یعنی چی کامل نیست .خوب resize می کنه دیگه

cardano7
شنبه 29 خرداد 1389, 01:03 صبح
سلام
چرا GetThumbnail رو امتحان نمی کنید؟

asefy2008
شنبه 29 خرداد 1389, 10:00 صبح
سلام
چرا GetThumbnail رو امتحان نمی کنید؟
یکم بیشتر توضیح بدی ممنون میشم.:لبخند:

cardano7
شنبه 29 خرداد 1389, 10:49 صبح
یکم بیشتر توضیح بدی ممنون میشم.:لبخند:

یک همچین قالبی داره:

Image img1 = ...;
img2 = img1.GetThumbnailImage(...);


بقیه ش رو خودتون سرچ کنید.

مصطفی ساتکی
شنبه 29 خرداد 1389, 21:51 عصر
شما می تونی از تبدیل WaveLet هم استفاده کنی که اساس کار Jpeg2000

cardano7
یک شنبه 30 خرداد 1389, 10:05 صبح
شما می تونی از تبدیل WaveLet هم استفاده کنی که اساس کار Jpeg2000

میشه بیشتر توضیح بدید؟

asefy2008
یک شنبه 30 خرداد 1389, 12:17 عصر
شما می تونی از تبدیل WaveLet هم استفاده کنی که اساس کار Jpeg2000


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

مصطفی ساتکی
یک شنبه 30 خرداد 1389, 14:59 عصر
اول از همه اینکه با تبدیل Wavelet می تونیم هر دو نوع فشره سازی Lossy و Lossless رو انجام بدیم فرق این دو در اینه که با روش دوم اطلاعات اطلاعات اصلی بدون هیچ کم و کاستی قابل بازیابیه مثل کاری که Zip و Rar دارن انجام می دن و در روش اول این اطلاعات اصلی قابل بازیابی نیست یعنی در انجام عملیات معکوس افت داده داریم مثل jpeg وMpg که هر دو شون با DCT پیاده شده (تبدیل کسینوسی گسسته) و البته wavelet هم بیشتر در حالت Lossy بکار میره مثل Jpeg2000 .
برخلاف DCT که توابع پایه ایش بر اساس سینوس و کسینوسه Wavelet به این صورت نیست بلکه از موجک های تشکیل شده با نام wavelets که از خاصیت های اصلی شون محدود بودن و فرکانس متغیرشونو .تئوری wavelet در ابتدا با تئوری MultiResolution شروع شد همین چیزی که جناب asefy2008 (http://barnamenevis.org/forum/member.php?u=71682)مطرح فرمودن.
همونطوری که از نام MultiResolution مشخص یعنی آنالیز و نمایش تصویر در Resolution های مختلف.جناب asefy2008 (http://barnamenevis.org/forum/member.php?u=71682) به نکته خوبی اشاره کردن که میخام در ابعاد مختلف پردازش کنم تا عمل پردازش با سرعت بالاتری صورت بگیره یکی از دلایل موردیش می تونه این باشه مثلاً کار کردن با Resolution مختلف مزیت های مهم تری هم می تونه داشته باشه . ممکن یه آبجکت در یک Resolution قابل تشخیص نباشه و با UpSampling(افزایش Resolution) کردن همون تصویر اون آبجکت قابل شناسایی باشه.اگر گذرتون به Ocr ها افتاده باشه اکثرشون برای بدست آوردن یک جواب مطلوب کارشونو در Resolution 300 انجام می دن .به فرض مثال شما تصویری رو با Resolution 100 به ocr بدید ممکن نوشته هایی که با فونت کوچکتر در جریان ف ی ل ت ر شدن بار اطلاعاتی خودشون از دست بدن و زمانیکه برای شبکه عصبی فرستاده میشه جواب مطلوب دریافت نکنید پس تو این فرایند MultiResolution یه فاز حیایتی محسوب میشه . البته قابل ذکر که همیشه اینطوری نیست که Resolution رو افزایش بدیم گاهی اوقات نیاز DownSampling هم انجام بدیم یعنی Resolution به حدی زیاده که Reco Engine ما کارایی شو از دست داده.
از جمله کاربردهایی رایج wavelet تو شاخه پردازش تصویر میشه به Edge Detection (تشخیص لبه) ,Noise Reduction (کاهش نویز)،Steganography (مخفی سازی تصاویر)،Layout Recognition(تشخیص طرح بندی صفحه) و فشرده سازی نام برد.
برای یه تصور شماتیک از MultiResolution یه هرم رو در نظر بگیرید نوک هرم دارای تصویر با پایین ترین کیفیته و در مبداً خودش دارای تصویر با بالاترین کیفیته هر چه این هرم رو به سمت پایین بیاد Resolution تصویر بالا می ره. تصویر مبداً ابعادش به صورت J^2 که در اینجا J معادل با Log2 N .برای رفتن به بالای هرم J رو کاهش بدید .

cardano7
یک شنبه 30 خرداد 1389, 16:19 عصر
میشه NameSpace ها و class های و متدهای مربوط به این کار رو هم معرفی کنید؟
چون تو سرچ کردن همیشه اصل مطلب بالا نمیاد و کلی وقت باید در لا به لای مسائل فرعی گشت!

aminghaderi
یک شنبه 30 خرداد 1389, 22:54 عصر
یعنی چی کامل نیست .خوب resize می کنه دیگه
خسته نباشید!!!
خوب برادر این که از واضحاته؟!
منظورم اینه که یک نمونه کد کامل بزار؟!
البته من شخصا کارم راه افتاده ، واسه دوستان گفته بودم.
مثل این لینک: (کامل و مرتب ، قابل استفاده)
http://barnamenevis.org/forum/showthread.php?t=228008

aminghaderi
یک شنبه 30 خرداد 1389, 22:57 عصر
میشه NameSpace ها و class های و متدهای مربوط به این کار رو هم معرفی کنید؟
چون تو سرچ کردن همیشه اصل مطلب بالا نمیاد و کلی وقت باید در لا به لای مسائل فرعی گشت!
این لینک رو ببینید ، شاید مشکلتون حل شه :
http://barnamenevis.org/forum/showthread.php?t=228008