PDA

نسخه کامل مشاهده نسخه کامل : پردازش تصوير در #C



محمد امين
10-10-2006, 22:40
سلام خدمت دوستان
يك سري سوال در مورد پردازش تصوير در #c دارم. اگه لطف كنين و راهنمايي كنين ممنون ميشم.
اول اينكه من ميخوام يك سري عمليات پيكسلي روي يك تصوير انجام بدم. مثلا دو تا حلقه for تو در تو بنويسم و تغييراتي در مقدار سطح خاكستري تصاوير اعمال كنم (تصاويرم خاكستري 8 بيتي هستند). چطور ميتونم اين كار رو بكنم؟ چند جا خوندم كه با دستورات LockBits و LockBits بايد تصوير را توي حافظه بار گذاري كرد و بعد با يك سري دستورات مثل stride و System.IntPtr ادامه كار انجام ميشه و در نهايت UnlockBits. ولي نميدونم چطوري اين كار رو بكنم. چند نمونه توي سايت codeproject و چند تا سايت ديگه ديدم ولي درست متوجه نشدم يعني اونجا دقيقا اين كاربرد نبود. توي MSDN هم كه اصلا درست راهنمايي نميكنه (از vs2005 استفاده ميكنم) در واقع من ميخوام به مقدار تصوير در هر پيكسل بصورت (i(x,y دسترسي داشته باشم يا بتونم تغييرشون بدم.
سوال دومم يه خورده تخصصي تره. ميخوام كد ----- وينر(wiener) رو اگه ميشه برام بذارين. ممنون از همه.

محمد امين
11-10-2006, 16:53
someone جان ميدونم الان داري اينو ميخوني. من يه مشكل ديگه هم پيدا كردم كه بيشتر گير اينم. من يه فرم ساده ساختم. حالا ميخوام يه برنامه رو توش اجرا كنم. ولي خطا ميده. اين مال اون فرمه هست:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

اينم مال اون برنامه هست:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

اينم خطاي اون:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

someone
11-10-2006, 16:56
سلام.
براي كار مورد نظرتون يه راه ساده وجود داره.
ميتونيد از GetPixel و SetPixel استفاده كنيد.با استفاده از SetPixel مقدار رنگ هر pixel رو بررسي كنيد
و با SetPixel ميتونيد رنگ هر pixel رو عوض كنيد. يه نمونه خيلي ساده
از كاربردش رو براتون ميذارم اگه مشكل حل نشداطلاع بديد.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

ممنون.

محمد امين
11-10-2006, 17:04
خيلي ممنون تستش ميكنم. البته تصاوير من رنگي نيستن. همونطور كه گفتم خاكستري 8 بيتي هستن. نميدونم اين دستورات روي اون تصاوير هم كار ميكنه يا نه؟
اگه زحمتي نيست هر موقع وقت كردي يه نگاهي هم به اون كدها و خطاش بنداز.
دستت درد نكنه

someone
11-10-2006, 17:06
دوباره سلام.
مشكل اينه كه شما از Main استفاده كرديد.
تابع main يك اسم reserved شده است وهر برنامه تنها يك تابع main و در حقيقت يك نقطه ي ورود داره.
شما در كلاسي كه نوشتيد دوباره از main استفاده كرديد.واين خطاست.
تابع main كلاستون رو برداريد.
اميدوارم متوجه شده باشيد.

محمد امين
11-10-2006, 17:16
دوباره سلام.
مشكل اينه كه شما از Main استفاده كرديد.
تابع main يك اسم reserved شده است وهر برنامه تنها يك تابع main و در حقيقت يك نقطه ي ورود داره.
شما در كلاسي كه نوشتيد دوباره از main استفاده كرديد.واين خطاست.
تابع main كلاستون رو برداريد.
اميدوارم متوجه شده باشيد.
بله متوجه شدم .ممنون. حالا اين قسمت از كد رو نگاه كنين:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
براي اجراي فرم، اين كد درسته؟ چون وقتي اجرا ميكنم فقط صفحه كنسول اجرا ميشه نه فرمي كه طراحي كردم. در واقع فرمم يه picturebox داره كه توش تصوير پردازش شده رو ميخوام نشون بدم.
بخشيد تند تند سوال ميكنم. وقتم تنگه ;)

someone
11-10-2006, 17:27
ببخشيد اگه جواب دادن طول ميكشه.
خطي كه ازش استفاده ميكنم فوقالعاده كند هست. البته امروز.
پروژره اي كه تعريف كرديد Console بوده؟ تعريف پروژه تون رو عوض كنيد و windowsApplication انتخاب كنيد.
در ضمن براي استفاده از كلاس بايد از new استفاده كنيد.وگرنه برنامتون درسته.

محمد امين
11-10-2006, 17:46
خواهش ميكنم. خيلي هم ممنون كه وقت ميذارين.
نه كنسول نبوده همون windowsApplication بوده ولي اجرا كه ميشه اينطوري ميشه:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

someone
11-10-2006, 17:47
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

البته در مورد new بايد اضافه كنم به كلاس و نوع تابع اون كلاس( static ,....) بستگي داره.

someone
11-10-2006, 17:55
اسم static void RunApplication رو به static void Main تغيير بديد.
فكر كنم هنوز از main در كلاسي كه نوشتيد استفاده ميكنيد.

محمد امين
12-10-2006, 00:16
سلام someone جان خسته نباشي
بله اون درست شد ممنون. چند تا سوال ديگه داشتم:
1. وقتي برنامه رو ديباگ ميكنم بجز فرمي كه ساختم، يه صفحه command هم مثل اين عكسي كه گذاشتم باز ميشه:

چي كار بايد بكنم كه اون نياد؟ يا اينكه طبيعيه؟

2. چطوري فايل exe برنامه رو درست كنم؟ دو تا exe با نام برنامه توي فولدرهاي bin و obj بود ولي اجراي اونا خطاي شكل زير رو ميده و وقتي هم كه ميزني ديباگ كنه outOfMemory Exception از فرم ميگيره!
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

3. چطوري ميشه المانهاي جديد رو به يك آرايه پيوند زد (وقتي كه اندازه آرايه رو از قبل نميدونيم!). اينطوري كه من ديدم با Array.Resize كه هر دفعه اعمال ميكني ميشه اين كار رو كرد كه هر دفعه يك سايز آرايه رو بزرگتر ميكني و بعد المان رو اضافه ميكني. ولي فكر ميكنم اين روش بهينه نباشه وسرعت رو پايين مياره. روش بهتري سراغ دارين؟

ببخشيد زياد شد!

someone
12-10-2006, 12:18
دوباره سلام.
اگه پروژه ای که ایجاد کردید WindowsApplication باشه نباید صفحه ی Command اجرا بشه.مگر اینکه
شما ور برنامتون با استفاده از کلاس Console این پنجره رو Call کنید. مثل Console.WriteLine و خیلی
چیزهای دیگه که باعث ظاهر شدن این پنجره میشن.
اما یه دلیل دیگش اینه که پروژتون ConsoleApplication باشه و شما یه Form به این پروژه اضافه کرده باشید.در این صورت بعد از اجرای برنامه همراه با Form پنجره ی Cmd هم ظاهر میشه و وقتی که برنامتون رو میبندید در Cmd عبارت press any key to continue ظاهر میشه. که فکر میکنم برنامه ی شما این مورد رو داشته باشه. مثلا :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

که Form1 یک WindowsForm هست که به پروژه ی ConsoleApplication اضافه شده.
همونطور که شما هم گفتید فایل exe ایجاد شده در این شاخه قرار میگیره:

\WindowsApplication1\WindowsApplication1\bin\Debug \........
یا
\WindowsApplication1\WindowsApplication1\bin\Relea se.......

در مورد error ی که گفتید بیشتر در شرایطی پیش میآد که دارید با آرایه ها کار میکنید ولی یه حالت کلی نیست.
در حالت کلی وقتی این error پیش میاد که حافظه ی کافی برای اجرای برنامه وجود نداشته باشه.
ونمیشه بدون دیدن برنامه نظر درستی داد. این یه مثال از مشکلیه که ممکنه پیش بیاد هست. بازم میگم که دلیلی نداره که حتما به این شکل باشه.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید



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

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


راستي بايد اضافه كنم ميتوتيد از عكسهاي 8bit هم در برنامه اي كه براتون گذاشتم استفاده كنيد.
در ضمن دو تاlink در مورد wiener filter براتون ميذارم كه البته مربوط به Matlab ميشه.شما هم توضيحي
در موردش نداديد.اميدوارم كمكتون كرده باشه.
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
موفق باشيد.

محمد امين
12-10-2006, 15:58
سلام someone جان
مشكل اون console حل شد. اشكال اين بود كه Output type توي پنجره properties بصورت پيشفرض! روي Console Application بود كه به windows application تغيير دادم وگرنه برنامه من از همون اولش ويندوزي بود. بگذريم.

مشكل اصلي من الان همون تصاوير خاكستري هست. يعني نميدونم اون دستورات getpixel و setpixel براي تصاوير خاكستري (كه رنگ ندارند) چطور استفاده ميشن؟ يعني من فقط ميخوام عدد سطح خاكستري هر پيكسل رو بخونم يا بنويسم ولي اون دستورات رنگ رو ميگيرند يا قرار ميدن. اگه ميشه راهنمايي بيشتر كنين.
خيلي ممنون.

someone
12-10-2006, 16:28
دوباره سلام.
ببخشيد ياد اون ديگه نبودم!
گفتم كه ميتونيد استفاده كنيد.
با استفاده از Getpixel ميتونيد اين كار رو انجام بديد.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

مقدار برگشتي اين تابع Color هست.اگه مي خوايد مطمئن شيد از اين كد ميتونيد استفاده كنيد.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

someone
12-10-2006, 16:47
در ضمن هر رنگ از تركيب سه رنگ بدست ميان.rgb
براي رنگهاي خاكستري مقدار اين سه پارامتر باهم برابر يا فوق العاده به هم نزديك هستند.
مثلا R=100 ,g=100, B=99
مقدار رنگ برگشتي رو بگيريد و با رنگ مورد نظرتون مقايسه كنيد.

محمد امين
12-10-2006, 17:10
در ضمن هر رنگ از تركيب سه رنگ بدست ميان.rgb
براي رنگهاي خاكستري مقدار اين سه پارامتر باهم برابر يا فوق العاده به هم نزديك هستند.
مثلا R=100 ,g=100, B=99
مقدار رنگ برگشتي رو بگيريد و با رنگ مورد نظرتون مقايسه كنيد.
سلام someone جان
مقاديري كه برميگردونه اصلا با مقادير واقعي پيكسلها همخواني نداره. البته سه مقدار آبي و قرمز و سبزش برابرن ولي با مقدار grayscale كه من خودم با MATLAB چك كردم فرق داره.
يه چيز ديگه هم هست. با اين روش setpixel فرمت دستورش چجوري ميشه اگه بخوايم يه عدد رو به يه پيكسل بديم؟
راستي پروژه رو هم توي PM براتون فرستادم. بي زحمت يه نگاهي بهش بنداز ممنون.

someone
13-10-2006, 08:30
دوباره سلام.
این یه مثال خیلی ساده از کاری که شما میخواید انجام بدید.البته کدش بهینه نیست وبه یه سری تغییرات جدی احتیاج داره.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اینها هم شکل قبل و بعد از این به اصطلاح فیلتر هستند.
قبل
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
بعد
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

البته میتونید به جای رنگها از متود FromArgb برای ایجاد رنگ دلخواه خودتون در تابع SetPixel استفاده کنید.
امیدوارم به کارتون اومده باشه.منتظر نتیجه هستم.
ممنون.

محمد امين
13-10-2006, 17:33
سلام.
با راهنمايي شما مشكل setpixel بصورت زير حل شد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

ولي اون مشكل اجراي EXE هنوز باقيه. وقتي توي خود برنامه هم Start without debugging رو اجرا ميكنم همونطوري ميشه ولي start debugging درست برنامه رو اجرا ميكنه. انگار بدون ديباگ كردن اون exception ايجاد ميشه!

محمد امين
14-10-2006, 17:04
روي يه كامپيوتر ديگه اجرا كردم (كه visual studio روش نصب بود) كه درست اجرا شد. روي يه كامپيوتر ديگه هم كه visual studio روش نصب نبود اصلا كار نكرد.
يكي از دوستان ميگفت براش بايد فايل نصب بسازي. راهي نيست كه همينطور يه EXE فايل تنها روي كامپيوتري كه VS نداره درست اجرا بشه؟
ممنون.

someone
14-10-2006, 20:09
سلام.
اگه هنوز رو سيستم خودتون براي اجراي برنامه با مشكل مواجه هستيد پيشنهاد ميكنم
از كلاس ها در يه پروژه ي جديد winapp استفاده كنيد.چون اين exception از Constructor كلاس
form شما گرفته ميشه.
اگه مشكلتون هم حل شده بگيد كه مشكل از كجا بوده.
مهم نيست كه رو client ي كه ميخوايد برنامتون روش اجرا بشه VS نصب باشه.مهم اينه كه حتما بايد
NetFrameWork. با همون version ي كه شما ازش استفاده كرديد رو client نصب باشه.يا اينكه
dll هاي مورد استفاده در برنامتون رو همراه خود برنامه publish كنيد.كه روش زياد درستي هم نيست.
دليلش هم اينه كه شما از كلاس هاي Net. در برنامتون استفاده ميكنيد. وهدف اصلي MS هم از
ارايه ي Net. همين بوده. يك platform براي همه.
اگه مشكلي بود اطلاع بديد.
ممنون.

محمد امين
14-10-2006, 23:13
سلام
اصلا من يه فرم ساده هم كه درست ميكنم بدون هيچ كد اضافه، باز هم اينطوري ميشه (يعني با start without debugging يا اجراي فايل EXE). با اين حال كاري رو هم كه شما گفتين انجام دادم ولي باز هم درست نشد. حتي يه setup براش ساختم. بعد از نصب باز هم وقتي اجرا كردم همينطوري شد! publish هم كه كردم باز هم در موقع اجرا همين خطا رو داد. روي كامپيوتر شما فايل EXE رو درست اجرا ميكنه؟ پروژه هايي كه من توي سايتها ميديدم يه demo داشتن كه فايل EXE برنامشون توش بود كه توي كامپيوتر منم درست اجرا ميشه. فكر ميكنم بايد چيزي بهش اضافه كنيم!

someone
15-10-2006, 05:27
دوباره سلام.
برنامه رو سيستم من بدون هيچ مشكلي اجرا ميشه.برنامه رو trace كردم ولي باز موردي پيدا نشد.
اين طور كه شما ميگيد ممكنه از framework يا VS شما , مشكل ايجادميشه.
تنها چيزي كه الان به نظرم ميرسه اينه شما اول Netframework. رو دوباره نصب كني البته Ver 2.0 رو
واگه مشكل حل نشد VS.Net رو هم دوباره نصب كنيد. شما جديدا package رو از سري MS Security
كه مربوط به سيستم ميشه نصب كرديد؟

محمد امين
15-10-2006, 13:17
سلام.
نه من هيچ package اي رو نصب نكردم. همون VS 2005 اول رو كه 8 تا CD هست نصب كردم (كار JB) كه معمول بازار هست. حالا نصب مجدد رو هم تست ميكنم.
ولي من يه كار ديگه كردم. يه نصب ساختم (با Setup and Deployment) بعد NET framework رو هم كنارش گذاشتم. رفتم روي يه سيستم ديگه و اول framework و بعد نصب رو اجرا كردم. بعد فايل EXE رو از فولدر نصب اجرا كردم كه برنامه درست اجرا شد. به هر حال بعضي مواقع متوجه نميشيم كه چرا يه چيز درست كار ميكنه يا نميكنه! مهم اينه كه كاري كنيم كه كار كنه!
خدا رو شكر كه اينم حل شد. يه سوال ديگه داشتم. چطور ميشه به آرايه هاي دو بعدي (يا تصاوير) دسترسي سطري يا ستوني داشت؟ مثلا توي MATLAB بصورت زير ميشه دسترسي سطري داشت:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
ممنون از لطفتون

someone
15-10-2006, 14:15
سلام.
وقتی یه برنامه رو تحت .Net مینویسم ناچاریم که از .Netframework روی client استفاده کنیم. دلیلش رو هم
که در موردش صحبت کردیم. برای اینکه یه برنامه رو publish کنید نیازی ندارید که حتما برای برنامتون Setup بسازید.گرچه با ساختنش بعضی از مشکلات حل میشه ولی نیازی نیست. تنها کافی فایل exe همراه resource ها در روی client کپی بشه. تنها موردی که خیلی مهم هست استفاده از framework با همون version ی هست که شما ازش استفاده کردید.چون مشکلاتی که به خاطر عدم هم خوانی ver ها پیش می یاد خیلی رایج هست. تا این حد که مثلا گه برنامه با framework 1.1 نوشته شده باشه وقتی رو framework1.0 اجرا بشه یکی از اولین مشکلات چیزی که برای شما ایجاد شده و فایل exe اجرا نمیشه.
درمورد مشکلی که برای شما پیش اومده هم فکر میکنم که مشکل ازFramework شما باشه گرچه حتما پیگیر قضیه هستم.خدا رو چه دیدید! شاید روزی هم فایل های exe ایجاد شده من هم دچار این مشکل بشن.
در مورد دوم هم بايد اضافه كنم آرايه هاي دوبعدي که به این شکل تعریف میشن و میتونید به دو روش اونها رو مقدار دهی کنید.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

یا

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
برای دسترسی به آرایه ها هم کافیه به این صورت عمل کنید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

محمد امين
15-10-2006, 14:35
يعني راه ديگه اي جز دسترسي تك عضوي نداره ديگه نه؟

someone
15-10-2006, 15:00
متوجه منظورتون نشدم. شايد منظورتون كد زير باشه:
با كد زير ميتونيد به تمام عناصر مثلا سطر دوم دسترسي داشته باشيد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

محمد امين
15-10-2006, 22:45
سلام someone جان خوب هستين؟
بازم سوال.
يك تصوير دارم كه بصورت باينري هست ولي مقدار سفيد اون 255 و سياه اون 0 هست. (به عبارت ديگه فرمتش Format8bppIndexed هست). ولي من ميخوام كه اين تصوير رو بصورتي در بيارم كه مقدار سفيد اون 1 و مقدار سياه اون 0 باشه. (يعني Format1bppIndexed كه البته توي فرمتها من نديدم داشته باشيم). مقدار رو هم نميخوام مستقيم از 255 به 1 تغيير بدم چون توي نمايش تصوير يه صفحه سفيد مياد بجاي تصوير سياه و سفيد. ميخوام تصوير همون شكلي بمونه فقط مقدار سفيدش 1 بشه.
دليل اين كارم هم اينه كه يك سري محاسبات سنگين روي تعداد زيادي تصوير (چند هزار تا) ميخوام انجام بدم و از طرفي تصاويري كه ميخوام باهاشون كار كنم بصورت 1 و 0 هستند و ضمنا با 0 و 255 كلي زمان پردازشش بالا ميره (بخاطر تكرار زياد)
راهي وجود داره كه اين تبديل رو انجام بدم؟

someone
16-10-2006, 03:54
دوباره سلام.
و ممنون.
همونطور که گفتید Format8bppIndexed اطلاعات هرpixel رو در یک byte یا 8bit نگهداری میکنه.
در کلاس Imaging یک enumerator وجود داره که به نام PixelFormat که format رنگ هر pixel از یک image رو مشخص میکنه. یکی از member هایی که داره Format1bppIndexed که pixelformat رو برای هر pixel یک بیت در
نظر میگیره. این همون کاری که شما میخواید انجام بدید. به نظر من میتونید
Image تون رو از هر format ی که هست ( 8bit,16bit,32bit ) به monochrome یا همون 1bitpp تبدیل کنید.در این
صورت همون طور که گفتید به ازای هر pixel تنها یک bit در نظر گرفته میشه. که یا 0 هست یا 1
بنابراین میتونید اول یه تبدیل انجام بدید و بعد image تون روprocess کنید.
برنامه ای که نوشتم این کار رو انجام میده ولی باز بهینه نیست.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


الگوریتم کار به این صورت هست:
عکس مورد نظر رو در یک Bitmap قرار میدید.بعد یک bitmap با طول و عرض عکس و با format
مورد نظر 1bitpp هست ایجاد میکنید.دقت کنین که این عکس توسط شما نوشته میشه. نوبت به استفاده از کلاس
BitmapData میرسه.چون ما نیاز دارم که عکس رو خودمون ایجاد کنیم. این کلاس باعث میشه که بتونیم از
LockBits و UnlockBits استفاده کنیم. استفاده از این دو تابع ضروریه. چون ما به یه Buffer نیاز داریم که بتونیم عملیات خوندن و نوشتن رو روش انجام بدیم(LockBits ) و نتیجه رو روی bitmap ایجاد شده کپی کنیم. (UnlockBits) .شروع میکنیم و با مقایسه ی تک تک pixel ها این کار رو انجام میدیم. اگه روشنایی pixel ها از 0.5 بيشتر بود در BitmapData مقدار 1 یا true رو قرار میدیم. توجه کنین که به طور پیشفرض تمام pixel ها 0 هستند و تصویر کاملا سیاه هست. تا حالا کاری که انجام دادیم رو Buffer بوده و توسط UnlockBits دوباره به bitmap خودمون انتقال میدیم. الان bitmap ما کاملا monochrome هست.

مهمترین بخش این برنامه تایع SetIndexedPixel هست که به صورت زیر تعریف میشه.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
توجه کنید که این تابع unsafe هست (به دلیل استفاده از pointer ها) و بنابراین باید اجازه
کامپایل شدن رو بهش بدید که با Set کردن گزینه ی Allow unsafe code برنامه کامپایل
میشه.
در ضمن این namespace رو باید به برنامه اضافه کنید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
امیدوارم توضیحات کامل بوده باشن. هر جا لازم شد بگید تا توضیح بدم.
كم كم داره جالب ميشه!

someone
16-10-2006, 11:03
راستي مشكلتون حل شد؟ دوبارهVS.net و framework نصب كرديد؟

محمد امين
16-10-2006, 14:39
راستي مشكلتون حل شد؟ دوبارهVS.net و framework نصب كرديد؟
سلام مجدد.
مشكلم كه حل شد .ولي نه با نصب دوباره اينها. بلكه همونطور كه گفتم با setup ساختن. البته هنوز با setup هم توي كامپيوتر خودم نشون نميده ولي مهم نيست. روي كامپيوترهاي ديگه اجرا بشه كافيه!
راستي راجع به اون برنامه اي كه براي 1 بيتي كردن نوشتيد، توضيحات شما كافي بود ولي من متوجه نشدم چور بايد از تابع Convert_8bitI_to_1bitI استفاده كنم؟ من الان يه تصوير دارم. اونو بجاي دستور تعريف bitmap ميارم. بقيه برنامه رو هم ميبرم توي متد اصلي كه نوشته بودم. ولي هنوز كار نميكنه. بذاريد ببينم مشكل از كجاست بهتون ميگم.
موفق باشين.

someone
16-10-2006, 17:02
مشكلم كه حل شد .ولي نه با نصب دوباره اينها. بلكه همونطور كه گفتم با setup ساختن. البته هنوز با setup هم توي كامپيوتر خودم نشون نميده ولي مهم نيست. روي كامپيوترهاي ديگه اجرا بشه كافيه!

من كه گفته بودم برنامه مشكلي نداره.
تنها منظورم مشكل file های exe شما بود.مسلما روي سيستم هاي ديگه اجرا ميشه.
چرا مهم نيست كه روي سيستم شما اجرا بشه؟
راستي چطور رو سيستم خودتون كد ها رو اجرا ميكنيد؟ اصلا كدها رو تست ميكنيد؟
درضمن گفتم كه بايد تغييراتي ايجاد كنيد اگه تصوير شما كاملا سياه و سفيد هست در استفاده
از تابع GetBrightness بايد تغيير ايجاد كنيد.چون باعث ميشه تصوير تغيير كنه.

محمد امين
16-10-2006, 21:34
براي اين ميگم مشكلي نيست چون من ميخوام اين پروژه رو تحويل بدم. پس روي كامپيوتر استادم بايد درست اجرا بشه!
خوب معلومه كه چطور اجرا ميكنم ديگه! ديباگ ميكنم و اگر مشكلي باشه trace هم ميكنم.

محمد امين
18-10-2006, 14:52
راستي يه چيز جالب! من برنامه رو كه توي MATLAB نوشته بودم توي 7 ثانيه اجرا ميشد. حالا توي #C توي 70 ثانيه! به همين خاطر ميگم كه تصوير 8 بيتي باينري با 1 بيتي باينري برام خيلي فرق داره. someone جان من توي بحث پوينترها هنوز مطالعه ندارم. براي همين نتونستم از كدهايي كه زحمتشو كشيدي استفاده كنم. حالا اگه برات زحمتي نيست هر موقع وقت داشتي يجوري يه متد برام بنويس كه تصوير 8bppIndexed يا 32bppRGB رو بگيره (تصاوير باينري بصورت 0 و 2 به توان n) و بعد بصورت 1bpp پس بده.
بهر حال خيلي ازت ممنونم.

someone
18-10-2006, 15:52
راستي يه چيز جالب! من برنامه رو كه توي MATLAB نوشته بودم توي 7 ثانيه اجرا ميشد. حالا توي #C توي 70 ثانيه! به همين خاطر ميگم كه تصوير 8 بيتي باينري با 1 بيتي باينري برام خيلي فرق داره. someone جان من توي بحث پوينترها هنوز مطالعه ندارم. براي همين نتونستم از كدهايي كه زحمتشو كشيدي استفاده كنم. حالا اگه برات زحمتي نيست هر موقع وقت داشتي يجوري يه متد برام بنويس كه تصوير 8bppIndexed يا 32bppRGB رو بگيره (تصاوير باينري بصورت 0 و 2 به توان n) و بعد بصورت 1bpp پس بده.
بهر حال خيلي ازت ممنونم.


سلام.
استفاده از اون كد به اصطلاح unsafe هست.چون ميشه در آدرسي كه pointer به اون اشاره ميكنه
تغيير ايجاد كرد. ولي در چنين برنامه هايي اهميت نداره.تابع SetIndexedPixel بخش خيلي مهمي ازين كدهست كه
نوشتن اطلاعات در يه فايل bitmap هست. اگه دنبال روند كار اين تابع هستيد بايد ساختار فايل bitmap رو بشناسيد.
شما براي اينكه از اين برنامه استفاده كنيد بايد در properties پروژه تون به قسمت build بريد و Allow unsafe code رو
set كنيد. برنامه مشكلي نداره وتنها نكته براي استفاده ازش set كردن اين property هست.
در ضمن اين متود هر تصوير با هر format ي رو به 1bpp تبديل ميكنه.

محمد امين
19-10-2006, 08:28
سلام.
يه سوال ديگه: من يك متد بصورت زير نوشتم:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

ولي خطاي 'method': not all code paths return a value
رو ميگيرم. فكر ميكنم مربوط به دستورات if باشه . ولي متوجه نشدم چطور درست ميشه؟
ممنون ميشم راهنمايي كنين.

someone
19-10-2006, 13:05
سلام.
مشكل اينه كه مقدار برگشتي تابع رو در try block قرار داديد و اين طور برداشت ميشه كه تابع شما برگشتي نداره.
ميتونيد اين مقدار رو در catch block قرار بديد يا از finally استفاده كنيد.
در ضمن از borderSequence به صورت public استفاده كنيد.

محمد امين
19-10-2006, 15:18
سلام.
مشكل اينه كه مقدار برگشتي تابع رو در try block قرار داديد و اين طور برداشت ميشه كه تابع شما برگشتي نداره.
ميتونيد اين مقدار رو در catch block قرار بديد يا از finally استفاده كنيد.
در ضمن از borderSequence به صورت public استفاده كنيد.
سلام
خوب اينجوري اگه exception اتفاق نيافته كه برگشتي نداره.
منظورتون رو از "از borderSequence به صورت public استفاده كنيد" متوجه نشدم.

someone
19-10-2006, 17:09
دوباره سلام.
بله شما درست ميگيد ولي من نگفتم كه مقدار برگشتي رو از try block برداريد و در catch block قرار بديد.
اينكار هم باعث ايجاد اون error ميشه.منظورم اين بود كه از برگشتي در catch block هم استفاده كنيد.
در ضمن borderSequence در try block تعريف شده و نميتونيد ازش در catch استفاده كنيد.
ميتونيد به صورت يه field عمومي براي كلاس و private يا قبل از try block تعريفش كنيد.
اگه اين امكان وجود نداره از يه field كمكي براي اين كار استفاده كنيد.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

يا


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

محمد امين
20-10-2006, 15:23
ممنون someone جان حل شد.
يه سوال ديگه داشتم. من الان يه فرم دارم كه توش يه progressBar هست. حالا توي كد اين فرمم يه متد رو از توي يه namespace ديگه كه خودم نوشتم فراخواني كردم (توي همين پروژه ولي توي يه CS فايل ديگه). حالا توي اون متد خارجي ميخوام progressBar1.performstep انجام بدم ولي progressBar1 رو توي اين متد نميشناسه. توي form1.Designer.cd اين progressBar رو public هم كردم ولي بازم نشد. كاري بايد بكنم كه اونو بشناسه؟ با روش زير هم نشناخت:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

someone
20-10-2006, 16:58
بهترین روش اینه که شما در namespace و کلاسی که دارید یه متود بنویسید که دارای یه آرگومان از
ProgressBar Class باشه بعد ازاین متود در کلاس form تون استفاده کنید.
مثلا به این صورت:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
شما یه عضو private در یه کلاس دارید.(در کلاس form) مسلما در کلاسهای دیگه نمیتونید ازش استفاده کنید.
( گرچه میشه این کار رو انجام داد ولی منطقی نیست.) در ضمن OOP رو هم در نظر داشته باشید.

محمد امين
21-10-2006, 13:28
سلام
بله someone جان متوجه شدم لطف كردين. حالا يه سوال ديگه دارم:
من دنبال روشي ميگردم كه بتونم تصوير رو حول يك نقطه بچرخونم (rotate) و بعد اندازه اون هم ثابت بمونه (يعني ببرتش). يعني ميخوام مختصات اون نقطه ثابت بمونه (نسبت به قبل از چرخش). توي دستورات RotateFlip در كلاس image هم همچين موردي نديدم (يعني در واقع RotateXYFlipNone ميخواستم كه نداشت). طريقه چرخوندنش هم مهم نيست: Bilinear، cubic، nearest neighbourhood يا هر طور ديگه. (براي ماتريسها انگار RotateَAt داشت كه چرخش رو نسبت به يك نقطه انجام ميداد ولي براي تصوير نديدم)
البته يه چيزي شبيه اين توي اين لينك ديدم:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
ولي هنوز دارم روش كار ميكنم (فكر ميكنم اول بايد انتقال بدم بعد گردش و دوباره برگردونم به نقطه مبدا). اگه شما هم راهنمايي كنين مممنون ميشم.
موفق باشي

محمد امين
21-10-2006, 21:32
سلام
بله someone جان متوجه شدم لطف كردين. حالا يه سوال ديگه دارم:
من دنبال روشي ميگردم كه بتونم تصوير رو حول يك نقطه بچرخونم (rotate) و بعد اندازه اون هم ثابت بمونه (يعني ببرتش). يعني ميخوام مختصات اون نقطه ثابت بمونه (نسبت به قبل از چرخش). توي دستورات RotateFlip در كلاس image هم همچين موردي نديدم (يعني در واقع RotateXYFlipNone ميخواستم كه نداشت). طريقه چرخوندنش هم مهم نيست: Bilinear، cubic، nearest neighbourhood يا هر طور ديگه. (براي ماتريسها انگار RotateَAt داشت كه چرخش رو نسبت به يك نقطه انجام ميداد ولي براي تصوير نديدم)
البته يه چيزي شبيه اين توي اين لينك ديدم:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
ولي هنوز دارم روش كار ميكنم (فكر ميكنم اول بايد انتقال بدم بعد گردش و دوباره برگردونم به نقطه مبدا). اگه شما هم راهنمايي كنين مممنون ميشم.
موفق باشي
اينم جواب خودم!! روي همون روشي كه اون لينك گفته بود كار كردم. شايد به درد ديگران هم بخوره!

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

محمد امين
22-10-2006, 12:43
سلام
someone جان مبحث pointer ها و كدهاي unsafe رو كجا ميتونم مطالعه كنم؟ اصلا اين مباحث جزء چه قسمتهايي هستند؟ من كتاب john sharp رو دارم. اينا رو توش نديدم!

someone
22-10-2006, 20:15
سلام
someone جان مبحث pointer ها و كدهاي unsafe رو كجا ميتونم مطالعه كنم؟ اصلا اين مباحث جزء چه قسمتهايي هستند؟ من كتاب john sharp رو دارم. اينا رو توش نديدم!

سلام.
شما هر منبعی از C یا ++C رو داشته باشید میتونید از اون مباحث استفاده کنید.
خیلی به هم نزدیک هستند.در ضمن يه نگاه هم به اين مقاله بكنيد.
كمكتون ميكنه.
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

محمد امين
23-10-2006, 01:48
سلام
ممنونم. someone جان با كمك شما كارم داره به پايان ميرسه. فقط همونطور كه در جريان هستي از لحاظ زمان پردازش مشكل دارم. ميدوني كه از كجا؟ به خاطر همون تصاوير Bitmap.
چون دستورات setpixel و getpixel تصاوير index رو پشتيباني نميكنن و هر بار كه ميخوام از اين دو تا تصوير استفاده كنم بايد بصورت زير بنويسم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
تا بعد در تصوير دوم از اون دو تا تصوير استفاده كنم. هر بار هم كه يه تصوير Bitmap به اين صورت ايجاد ميكنم، فرمتش 24bpp Argb هست (24 بيتي!) و كلي سرعت رو پايين مياره (توي تعداد زياد).
حالا راهي نيست كه ما براي تصاوير index هم از دستورات مشابه getpixel و setpixel استفاده كنيم؟ اگر هم جوابتون منفيه، حداقل يه راهي بگين كه تصاوير رو با فرمت دلخواه ايجاد كنيم نه 24bpp (تصويرهاي index من حداكثر 8bpp هستند.)

someone
24-10-2006, 02:40
سلام.
من متوجه نشدم. مگه از برنامه اي كه براتون گذاشتم استفاده نميكنيد؟
اون برنامه كارش تبديل format تصاوير هست.كافي كمي تغييرش بديد تا تصاوير رو به format دلخواه شما در بياره.
مثلا از 24bpp به 1bpp يا 4bpp يا 8bpp و غيره.
در ضمن براي اينكه با تاخير جواب ميدم , ببخشيد. يك مقداري سرم شلوغه.

محمد امين
24-10-2006, 15:51
سلام.
من متوجه نشدم. مگه از برنامه اي كه براتون گذاشتم استفاده نميكنيد؟
اون برنامه كارش تبديل format تصاوير هست.كافي كمي تغييرش بديد تا تصاوير رو به format دلخواه شما در بياره.
مثلا از 24bpp به 1bpp يا 4bpp يا 8bpp و غيره.
در ضمن براي اينكه با تاخير جواب ميدم , ببخشيد. يك مقداري سرم شلوغه.
سلام someone جان
اون برنامه رو كه خدمتت عرض كردم هنوز نتونستم ازش استفاده كنم. مگر اينكه بصورت يه متد در بياد چون هنوز من از پوينترها سر در نميارم!
سوال من اينه كه براي تصاوير index چطور ميشه اين كار رو كرد؟ چون ظاهرا اين تصاوير حافظه كمتري اشغال مي‌ كنند و سرعت كار بالا ميره. يعني اصلا تصاوير رو هم به صورت index بخونم هم بصورت index تغيير بدم و ...
البته كارم با تصاوير bitmap هم راه افتاده و يه فكري هم براي زمان پردازش كردم!
ازت ممنونم. من مثل شما سرم شلوغه و اين پروژه برام شده بود غوض بالا غوض!

someone
25-10-2006, 01:10
سلام.
اميدوارم تو پروژتون موفق باشيد. در ضمن خوشحال ميشم اگه بتونم كمكي كرده باشم.
شما ميتونيد از اون برنامه به شكل زير و در قالب يك كلاس(لزومي نداره) استفاده كنيد.
من فقط كد قبلي رو مرتب كردم. در ضمن يادتون باشه Allow unsafe code رو set كنيد.
project -> projectname properties( or Alt+F7 ) -> Build -> Allow unsafe code


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

اميدوارم كمكتون كنه.
اگه مشكلي پيش اومد اطلاع بديد.

محمد امين
26-10-2006, 22:00
سلام.
خوب someone جان اگه حالا بخوايم اين متد رو فراخواني كنيم چطوري بايد اين كار رو بكنيم؟ منظورم Convert_8bitI_to_1bitI هست. در ضمن من ميخوام تصوير رو از بيرون بهش بدم يعني:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا براي PaintEventArgs چطور بايد بهش ورودي بدم؟

someone
27-10-2006, 00:57
سلام.
كافيه اين متود رو به اين شكل تغيير بديد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

به

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

محمد امين
27-10-2006, 08:44
سلام.
من كد رو بشكل زير تغيير دادم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
چون متد SetIndexedPixel رو نميديد، static كردمش.
تنها خطايي كه الان ميده اينه:
The name 'e' does not exist in the current context
كه فكر ميكنم بايد متغير گرافيكي رو براش تعريف كنم. اينطور نيست؟ (توي همون متد؟)

someone
27-10-2006, 23:46
سلام.
error پيش اومده به خطر اين خط هست:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
كه لازم نيست شما ازش استفاده كنيد.من براي رسم روي Dialog از اين كد استفاده كردم.
ميتونيد حذفش كنيد.

محمد امين
28-10-2006, 01:19
سلام
اين قسمت:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
يك exception رو ايجاد ميكنه با اين پيام:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

فراخواني من به اين صورته:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

محمد امين
28-10-2006, 01:56
راستي someone جان يه سوال ديگه داشتم. دارم براي پروژه يه setup ميسازم. روي كامپيوتر مقصد NET framework نصب نيست. ولي برنامه نصب ميخواد بره و از مايكروسافت دانلود كنه(بطور پيش فرض)

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا من اگه بخوام از يه فايل محلي NET framework 2 توي همون شاخه نصب برنامه اين كار رو بكنم (يعني مثلا فايل dotnetfx.exe رو توي پروژه بذارم و در مقصد همراه نصب انتقال بدم) ميشه اين كار رو كرد نه؟ (چون فايل 20 مگي اون رو دارم)
من توي MSDN به اين شكل ديدم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ولي بصورت dotnetfx.exe\ آدرس دادم ولي نشناخت!

someone
28-10-2006, 17:33
سلام.
دلیل Exception این هست که شما هنوز به این صورت از کد استفاده میکنید :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و چیزی برای بازگشت وجود نداره چون منابع Dispose شدند.
باید به این صورت کد رو تغییر بدید.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در مورد مشکل دوم روشتون درست به نظر میاد.ولی من تا حالا امتحان نکردم.
اجازه بدید تست کنم و تنیجش رو به شما خبر میدم.

sharon
28-10-2006, 17:55
سلام بچه ها . تو رو خدا به من كمك كنيد . من برنامه اي ميخواهم كه بتونه يك فايل bitmap 300 dpi رو به يك فايل jpg 72 dpi تبديل كنه . تورو خدا زود مرسي .

sharon
28-10-2006, 17:57
سلام بچه ها . تو رو خدا به من كمك كنيد . من برنامه اي ميخواهم كه بتونه يك فايل bitmap 300 dpi رو به يك فايل jpg 72 dpi در محيط پاسكال يا c تبديل كنه . تورو خدا زود مرسي .

someone
28-10-2006, 17:57
سلام.
براتون link گذاشتم.

someone
28-10-2006, 23:21
دوباره سلام.
یه روش ساختن setup برای برنامتون این کار هست و مشکلتون رو حل میکنه.
روی solution راست کلیک کنید و از گزینه Add گزینه Newproject رو انتخب کنید.
بعدش به قسمت OtherProjectType برید و Setup and Deployment رو , واز Template گزینه ی
SetupWizard رو انتخاب کنید.
در پنجره ای که باز میشه دو بار Next بزنید تا به Choose Project outpus to Include برسید.
Primary outputs و Contents File رو Set کنین.در مرحله بعدی از Add به پروژتون .Net Framework رو اضافه کنید. ادامه بدین و روی Finish کلیک کنید. از منوی Build گزینه Build Setup1(اسم پروژتون)
رو انتخاب کنید. کار تموم شده ویک Setup تمیز و راحت برای خودتون میسازید.
در هنگام نصب برنامه framework هم نصب میشه.

محمد امين
29-10-2006, 00:35
دوباره سلام.
یه روش ساختن setup برای برنامتون این کار هست و مشکلتون رو حل میکنه.
روی solution راست کلیک کنید و از گزینه Add گزینه Newproject رو انتخب کنید.
بعدش به قسمت OtherProjectType برید و Setup and Deployment رو , واز Template گزینه ی
SetupWizard رو انتخاب کنید.
در پنجره ای که باز میشه دو بار Next بزنید تا به Choose Project outpus to Include برسید.
Primary outputs و Contents File رو Set کنین.در مرحله بعدی از Add به پروژتون .Net Framework رو اضافه کنید. ادامه بدین و روی Finish کلیک کنید. از منوی Build گزینه Build Setup1(اسم پروژتون)
رو انتخاب کنید. کار تموم شده ویک Setup تمیز و راحت برای خودتون میسازید.
در هنگام نصب برنامه framework هم نصب میشه.
سلام مجدد.
بله اضافه ميشه منتهي مثل اينكه windows installer رو هم روي كامپيوتر مقصد بايد اول نصب كنيم. چون من خواستم اول framework بعد برنامه مربوط به پروژه رو روي سيستم مقصد نصب كنم ولي توي نصب framework اين windows installer رو خواست. روي سيستم خودم با نصب VS2005 اين نرم افزار هم نصب شده. اون رو هم از روي سي دي VS2005 رو پيدا كردم و به نصب اضافه كردم با اين نام: WindowsInstaller-KB893803-v2-x86.exe فكر كنم اين رو هم بصورت خودكار نصب كنه هنوز تست نكردم.

راستي نوشتن كد به اين صورت:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اين warning رو ميده:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
تصويري هم كه برميگردونه سياه سياهه. تصوير ورودي به اون مقادير پيكسلهاش بين 0 و 255 هستند و من كد رو به اين شكل تغيير دادم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
يه سوال ديگه هم داشتم. شما تا حالا ديدين توي سي شارپ شبكه‌هاي عصبي (Neural Network) رو پياده‌سازي كنن؟ اين شبكه ها توي شناسايي الگو و پردازش تصوير كاربرد دارند. (حالا هر نوعش كه باشه: Backpropagation، (Radial Basis Function)RBF و غيره)

someone
29-10-2006, 00:58
سلام.
در مورد اول بعيد ميدونم به windowsInstaller نياز داشته باشيد.
حتما تست ميكنم و نتيجه رو بهتون ميگم. چون الان برام مقدور نيست.
واقعا تعجب كردم از سوالتون! تا حالا نديده بودم كسي دنبال اين چيزها باشه.
تعجبم از اين بابت هست كه شما يهو به Neural Network رسيديد!
مي خوام بدونم چه رشته اي ميخونيد و در كجا؟
بله ميشه. مطالب زيادي هم وجود داره.
در مورد back-propogation هم ميتونيد به اين link مراجعه كنيد.
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
در ضمن يه نگاهي هم به اين link بكنيد
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

محمد امين
29-10-2006, 01:07
البته پست 60 رو اديت كرده بودم. اگه ميشه يه نگاهي دوباره بهش بندازين! تعجبتون منطقيه. من فوق الكترونيك ميخونم. توي يكي از دانشگاههاي تهران. البته موضوع من (شناسايي الگو) زياد ربطي به خود الكترونيك نداره!

someone
29-10-2006, 01:42
فوق العاده ست!
جالب ابنه كه منم الكترونيك ميخونم البته در مقطع كارشناسي.
در مورد مشكلي كه پيش اومده بايد بگم:
مقدار برگشتي تابع GetBrightness بین 0و1 هست وشما از 50 استفاده کردید.
دلیل این error اينه كه شما يه instance با مقدار null در برنامه داريد.
برنامه مشکلی نداره.شما براي load كردن Image بايد از
Constructor كلاس bitmap استفاده كنيد.مثلا:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

محمد امين
29-10-2006, 02:05
احتمالا همونطور كه متوجه شديد برنامه اي كه توي پست 60 آورده بودم ميخواد يه تصوير رو كه بصورت bitmap (اينجا 32bppArgb) هست به 8bppIndexed تبديل كنم. براي همون آستانه رو 50 گذاشتم. نميدونستم GetBrightness خروجيش 0 و 1 هست. الان به اين صورت نوشتم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
البته يه تستي ميكنم بعد ميگم چي شد.
راستي از اين كه هم رشته‌اي هستيم خوشحالم. خدمتي از دستم بر بياد هم خوشحال‌تر ميشم كمك كنم.

fazi
12-11-2006, 11:45
سلام
من مي خوام يه عكس رو كه فرمت tif داره رو display كنم . مي شه كدهاي C# اين كار رو به من بديد .

someone
12-11-2006, 15:18
سلام.
برای نمایش تصاویر از نوع tif کافی تنها از constructor کلاس bitmap استفاده کنید :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
تصویر مورد نظر در bitmap قرار گرفته میتونید اون رو پردازش کنید یا نمایش بدید.

fazi
12-11-2006, 15:56
مرسي از جوابتون
من از اين كدها استفاده كردم
Image newImage = Image.FromFile("c:\\Test.tif");
Bitmap bitmap = new Bitmap(newImage);
Bitmap bTemp = new Bitmap(Image.FromFile("c:\\7.tif"));
for (int x = 0; x < bitmap.Width; ++x)
for (int y = 0; y < bitmap.Height; ++y)
bTemp.SetPixel(x, y, bitmap.GetPixel(x, y));
pictureBox1.BackgroundImage = bTemp;
مشكلي كه دارم اينه كه مي خوام از pictureBox1 استفاده نكنم .
چطور مي شه اين كار رو كرد ؟

someone
12-11-2006, 16:19
دوباره سلام.
براي اينكه بتونيد يك تصوير رو روي form نشون بديد كافي Paint Event رو به
form تون اضافه كنيد. در متود اضافه شده به شكل زير عمل كنين:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

ميبينيد كه به راحتي تصوير قابل نمايش هست.
اگه مشكلي بود اطلاع بديد.

fazi
12-11-2006, 17:20
ببينيد من در استفاده از اين متد دچار يه مشكل مىِشم و اون اينه كه چطور اين متد رو فراخواني كنم !!!

someone
12-11-2006, 23:40
سلام.
براي اينكه ازين متود استفاده كنيد بايد رويداد paint رو call كنيد.
به اين شكل عمل كنين:
form رو انتخاب كنيد و از properties روي Events كليك كنيد. در قسمت Appearance اسمي براي
Paint Event انتخاب كنيد مثلا OnPaint و اين متود به صورت خود كار ايجاد ميشه.
البته دليلي براي استفاده از اين روش نداريدوميتونيد اين كار رو خودتون انجام بديد.
در متود ايجاد شده كد رو وارد كنيد.
Paint Event باعث ميشه وقتي كه لازمه form دوباره نقاشي بشه. مثلا وقتي كه form زير يك form ديگه قرارميگيره.
اميدوارم مشكل حل بشه.

fazi
13-11-2006, 11:31
راستش فكر كنم بايد به طور كامل c# رو ياد بگيرم ولي اصلا وقت ندارم . ممنوم كه جواب سوالم رو داديد .

fazi
19-11-2006, 13:28
سلام
باز من يك سوال دارم
راستش مي خوام وقتي رو ي button1 كليك مي كنم عكس مورد نظرم display بشه .
و در اصل تابعonpaintرو به صورتي دستي فراخواني كنم !

someone
24-11-2006, 15:56
دوباره سلام.
ميتونيد از كد زير استفاده كنيد.
pb يك pictureBox هست.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در ضمن براي call كردن OnPaint كافي از Invalidate استفاده كنيد.
هر بار كه از اين متود استفاده كنيد OnPaint كنترل مورد نظر رو دوباره نقاشي ميكنه.

fazi
24-11-2006, 22:47
ممنون از پاسختون .

fazi
14-12-2006, 11:57
ببینید راهی برای بهتر نوشتن این کد دارید

**************************************
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace WindowsApplication29
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{

Rectangle rect = new Rectangle(0, 0, 2048, 2048);

e.Graphics.DrawImage(ima.ime1.sjd(), rect);
}
}
}

namespace ima
{
class ime1
{
public static Bitmap sjd()
{
int j, c, l;
l = 0;
FileStream fs = File.Open("c:\\b1.dat", FileMode.Open);
Bitmap res = new Bitmap(2048, 2048);
Color cc;

for (j = 0; j < 2048; j++)
for (c = 0; c < 2048; c++)
{
int re = fs.ReadByte();
cc = Color.FromArgb(re,re,re);
res.SetPixel(c, j, cc);
l++;
}

fs.Close();
return res;


}

}

}