اطلاعیه

Collapse
No announcement yet.

zoom

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    zoom

    سلام به دوستان.
    کسی نیست اینجا که در مورد کوچیک کردن سایز تصویر اطلاعاتی داشته باشه؟ مثلا 3000*4000 رو بکنه 2000*1500
    خودم تو C# برای تست یه برنامه نوشتم که این کار رو بکنه اما سرعتش زیاد جالب نبود.و اینکه به سایز های دلخواه نمیشد تغییر داد. کسی منبعی برای این کار نداره؟
    [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

    #2
    پاسخ : zoom

    چرا متلب رو امتحان نمی کنید؟ باید حتما با #c باشه؟
    It's nice to be important but it's important to be nice!

    از اینکه نمی رسم جواب دوستان را بدم معذرت می خوام.

    دیدگاه


      #3
      پاسخ : zoom

      رضا جان تا اون جا که من میدونم متلب از C# کند تر هست تو مساله پردازش.(البته ابن کار رو با استفاده از توابع خودش سریع انجام میداد بیچاره :icon_razz
      مساله من برنامه نیست اصلا. اصلا شما اگه میتونی بیا با vb بگو :mrgreen: بیشتر دنبال الگوریتم کار هستم و این که الگوریتم رو بهینه کنم تا بشه روی میکرو ها ام استفاده کرد.نوشتن و تست برنامه تو C# خیلی ساده تر از پیاده سازی رو میکرو هست واسه همین این کار رو کردم.
      [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

      دیدگاه


        #4
        پاسخ : zoom

        اگه اشتباه نکنم یه بار از استادم شنیدم که اینکار با درون یابی و برون یابی انجام میشه. یعنی وقتی میخوای بزرگنمایی کنی باید بین دو پیکسل یه مقدار پیدا کنی که موقع فاصله گرفتن از هم اون رو بینشون بذاری.
        فکر کنم بهتره دنبال چند تا مقاله خوب باشی.
        It's nice to be important but it's important to be nice!

        از اینکه نمی رسم جواب دوستان را بدم معذرت می خوام.

        دیدگاه


          #5
          پاسخ : zoom

          منم با همین سیستم کار کردم اما سرعتش بد بود.C#اینجوری میکرد دیگه میکرو.....
          شما مقاله ای سراغ داری؟ من کلی گشتم چیز بدرد بخوری پیدا نکردم.
          [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

          دیدگاه


            #6
            پاسخ : zoom

            وقتی میخوان اندازه تصویر رو تغییر بدن و کمترین کاهش رو در کیفیت داشته باشن از درونیابی یا بالعکس درجه بالاتر استفاده میکنن اما فکر میکنم واسه کار شما یه میانگیری ساده بین 4 پیکسل همسایه یا حتی ساده تر از اون یعنی قرار دادن یکی از پیکسلها به جای 4 تا کارتون رو راه میندازه.
            براای سایزهای دلخواه دوباره میتونی یه اسکیل بزنی یعنی حساب کنی یه پیکسل تو تصویر دوم در تصویر اول کجا بایستی باشه (یا بالعکس) اووقت خیلی راحت مقدار پیکسل تو تصویر اول رو میذاری سرجای اون (این کار یه کم رو کیفیت تاثیر داره) یا میتونی دوباره از میانگین گیری بین بین پیکسلهای همسایه در تصویر اول استفاده کنی . خب همینی که هست میخوای بشین directx کار کن وگرنه با این توابع موجود چاره ای نداری. این توابع واسه باز کردن یه دونه بیت مپ جونشون در میاد

            دیدگاه


              #7
              پاسخ : zoom

              من اول 4تا 4 تا میانگین گرفتم.دیدم سرعتش جالب نیست. اومدم از این 4 تا فقط اولی رو به عنوان پیکسل جدید گرفتم.سرعت بهتر شد اما بازم کم بود.مثلا image viewer خود ویندوز با چه الگوریتمی کار میکنه که اینقدر سریع کار میکنه؟ این روش من برای عکس های کوچیک خوب جواب میداد اما برای عکس های بزرگ اونقدر طول میکشید که مجبور شم progress bar بزارم :mrgreen:(کیفیت کار ولی خیلی خوب هست )
              برای مواقعی که سایز عکس مضرب 4 نباشه چطور میانگین گیری صورت میگیره؟ مثلا 300*300 بشه 250*200 :question:
              [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

              دیدگاه


                #8
                پاسخ : zoom

                فکر نمی کنم بشه از الگوریتم های ویندوز به این راحتی استفاده که چون احتمالا توشون هم پایپ لاین هست هم پارالل پروسس.
                ممکنه راه های دیگه ای هم برای بهبود سرعت انجام شده باشه.
                It's nice to be important but it's important to be nice!

                از اینکه نمی رسم جواب دوستان را بدم معذرت می خوام.

                دیدگاه


                  #9
                  پاسخ : zoom

                  یه راه ساده میتونه این باشه که در طول و عرض تصویر به تعداد پیکسل های خروجی خطوط فرضی بکشید و محل برخورد این نقطه ها رو به عنوان پیکسل جدید بگیرید. فرضا برای تبدیل یه تصویر 300 در 300 به 250 در 200
                  برای طول تصویر، پیکسل های تصویر جدید از ضرب شماره هر پیکسل در (300 تقسیم بر 250) به دست میاد. عرض تصویر هم مشابه همین

                  11*5 به 8*3


                  پیکسل های تصویر جدید (در حالتی که نسبت زوم زیاد نباشه) معمولا مجاور 4 پیکسل هست. در صورتی که قدرت پردازشی کافی در اختیار داشته باشید میتونید بسته به دوری و نزدیکی محل پیسکل جدید از پیکسل های قدیمی، این 4 پیکسل رو با درصد های متفاوتی با هم ترکیب کنید (میانگین غیر متقارن)

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

                  برای خوندن همه ی پیکسل ها یا باید از امکانات کامپایلر استفاده کنید و یا اینکه خودتون مستقیما داده ها رو از فایل استخراج کنید.
                  تو وی بی تا جایی که یادمه از تابع CopyMemory (از توابع kernel.dll) استفاده میشد. دات نت هم بعید میدونم این امکان رو نداشته باشه

                  خواندن مستقیم اطلاعات از فایل با توجه به تعداد فرمت ها و تنوع پیاده سازی ها در هر فرمت یه مقدار سخته
                  BMP ها اگر فشرده سازی نداشته باشند به راحتی میشه داده ها رو خوند. کتاب "قالب های فایل های گرافیکی" (دیوید سی. کی و جان آر.لوین) ترجمه ی محمد نوروزی ، در مورد بعضی از قالب ها توضیح داده شده
                  زندگی پر ز وجود است ولی ..
                  ما چه را می خواهیم چه را می جوییم که لب چشمه ی امید اینچنین نا امیدانه به سرابی تلخ مینگریم...

                  دیدگاه


                    #10
                    پاسخ : zoom

                    این روش خط کشی خیلی جالب بود.باید خوب از آب دربیاد.
                    برای خوندن عکس هم از یه متغیر Bitmap استفاده میکنم که یه jpg یا bmp داخلش میریزم.برای خوندن و نوشتن پیکسل ها هم از تابع های setpixel و getpixel استفاده میکنم.
                    [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                    دیدگاه


                      #11
                      پاسخ : zoom

                      بفرما
                      http://www.codeproject.com/Articles/11143/Image-Resizing-outperform-GDI
                      http://ceworld.ir/images/ads/dornablogcom_ads.gif

                      دیدگاه


                        #12
                        پاسخ : zoom

                        نوشته اصلی توسط ZJ-BJ
                        بفرما
                        http://www.codeproject.com/Articles/11143/Image-Resizing-outperform-GDI
                        راستش هدفم پیدا کردن الگوریتم هست که بشه رو میکرو ها پیاده کردش.این لینک از توابع سیستم استفاده میکنه که نمیشه فهمید چطوری کار میکنه.اما بازم دستت درد نکنه.حتما میخونمش.یه موقع لازم میشه از توابع سیستمی استفاده کرد و قطعا کار آمد هست.
                        [hr]
                        :wow: با استفاده از همین سیستم خط گزاری یه برنامه نوشتم خیلی خوب کار میکنه. از 1% تا 400% جواب خوبی میده.کیفیتش هم کم نمیشه اونقدر. اگر کسی خواست بگه برنامش و یا کدش رو بزارم. فقط یه مشکل این هست که اگه سایز تصویر تقریبا از هزار و.... بیشتر بشه سرعت کار پایین میاد کمی.مثلا اگه بخوایم 1500*1500 کنیم. اگر به جای استفاده از bitmap مستقیم از خود فایل بخونم سریع تر میشه؟(البته دیگه نمیتونم jpg رو استفاده کنم)
                        [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                        دیدگاه


                          #13
                          پاسخ : zoom

                          اگر به جای استفاده از bitmap مستقیم از خود فایل بخونم سریع تر میشه؟(البته دیگه نمیتونم jpg رو استفاده کنم)
                          [/quote]
                          مطمئنا چون اطلاعات یکجا خونده میشه. ولی به خاطر اینکه عمق رنگ ممکنه متفاوت باشه برای به دست آوردن رنگ پیکسل ها یه پردازش جزئی میخواد. خوندن از فایل یه مقدار دردسر داره

                          تو سی شارپ با CopyPixels پیکسل ها رو خیلی سریع میشه کپی کرد
                          string path = @"...";
                          Bitmap bmp;
                          bmp = new Bitmap( path);
                          BitmapImage bi = new BitmapImage(new Uri( path));
                          int BitDepth = 32;
                          int stride = (bmp.Width * BitDepth + 7) / 8;
                          int[] p = new int[bmp.Width * bmp.Height];
                          bi.CopyPixels(p, stride, 0);
                          پیکسل های یه تصویر 8000*8000 رو 2.5 ثانیه طول کشید کپی کنه. اگه بتونید رو میکرو فریم ورک نصب کنید سرعتش خیلی خوبه :mrgreen:
                          زندگی پر ز وجود است ولی ..
                          ما چه را می خواهیم چه را می جوییم که لب چشمه ی امید اینچنین نا امیدانه به سرابی تلخ مینگریم...

                          دیدگاه

                          لطفا صبر کنید...