نویسنده موضوع: نحوه فشرده سازی اطلاعات  (دفعات بازدید: 5580 بار)

0 کاربر و 1 مهمان درحال دیدن موضوع.

آفلاین Modj

  • مدیر سایت
  • ***
  • ارسال: 1146
    • ديدن مشخصات
    • موج
نحوه فشرده سازی اطلاعات
« : ۱۷ فروردین ۱۳۸۸ - ۱۹:۴۶:۲۱ »
توو این تاپیک خیلی کلی راجع به این موضوع حرف می زنم و سعی می کنم اگر بحثش پیش  اومد ، توو بخشهای مربوط به زبانها، مثالی برای هر زبان بنویسم.


در کل  وقتی بحث فشرده سازی مطرح می شه، نوع اطلاعاتی که قرار هست فشرده بشن مهمه، بعضی  جاها ، اطلاعاتی که داریم خیلی بیشتر از نیاز ما هست،برای همین میشه بخشی از این  اطلاعات رو از بین برد، بعضی وقتها یک سری از اطلاعات رو می شه با دیتای غلط  جایگزین کرد ، اما نسبت فشرده سازی ای که بدست اومده به میزانی که اطلاعات از بین  می ره کاملا می ارزه ( فرض کنین می خواین اطلاعات آماری قد دانش آموزهای یک مدرسه  رو نگه دارین، 99 % قدها بین 150 تا 200 cm هستن، حالا اگر بین 900 نفر 4 نفر قد  130cm داشته باشن، اون ها رو همون 150cm بگیریم اطلاعات آماری سالانه قد ها، آنچنان  وضع ناجوری پیدا نمی کنه ! ) بعضی اطلاعات هم مو به مو مهم هستن !


سعی  می کنم روشهای موجود رو در زیر تا جایی که می تونم توضیح بدم
مرا امداد کسان افکنده بود از پای ............. مدد از بی کسی ها جستم و امداد خود کردم

آفلاین Modj

  • مدیر سایت
  • ***
  • ارسال: 1146
    • ديدن مشخصات
    • موج
پاسخ : نحوه فشرده سازی اطلاعات
« پاسخ #1 : ۱۷ فروردین ۱۳۸۸ - ۱۹:۴۶:۴۵ »
اولین روشی که برای فشرده کردن به کار می ره این هست که اگر ما نوع دیتایی که برای  اطلاعاتمون در نظر گرفتیم ، بتونه اطلاعاتی با تعدادی بیشتر از اون که مورد نیاز ما  هست رو نگه داره،عملا تعدادی بیت رو از بین بردیم. اگر بخوام این موضوع رو با مثالی  توضیح بدم اینطوری باید بگم که اگر ما اعدادی بین 0 تا 200 رو بخوایم نگه داریم، به  ازای هر عدد کافیه که 8 بیت رو داشته باشیم، حالا اگر اعداد رو توو واحدها حافظه 16  بیتی نگه داریم، عملا توو هر عدد 8 بیت رو حروم کردیم !
دقیقتر توضیح بدم، ما 10  عدد داریم، تعداد اعداد از لحاظ تنوع 10 تاست، اما این عددها، بین 6 میلیون و  6000009 هستن ! یعنی عددها ما اینها هستن  :
6000000
6000001
6000002
6000003
...
6000009
برای اینکه  بتونیم این اعداد رو نگه داریم،باید 23 بیت رو به ازای این اعداد در نظر بگیریم  !چون مثلا 6000000 یعنی 10110111000110110000000
حالا فرض کنین فایلی داریم که  خروجی دستگاهی هست که در زمانهای مختلف یکی از این 10 حالت (10 عددی که گفتم ) رو  می تونه به خودش بگیره، 1 ساعت، هر ثانیه این خروجی رو می خوایم ذخیره کنیم. یعنی  فایلی حاصل می شه که 3600 عدد هست که هر کدوم مربوط به یکی از ثانیه هاست و شامل  یکی از این اعداد 23 بیتی هست که گفتم. پس فایل حاصل حجمی حدود 23*3600 بیت یعنی  82800 بیت که حدود 10350 بایت هست رو اشغال می کنه. در حالت بدون فشرده سازی، حجمی  حدود 10 کیلو بایت برای این کار مصرف میشه.
ما برای نگهداری این اعداد از 23 بیت  استفاده کردیم، 23 بیت می تونه 8388608 حالت مختلف رو نگه داره، اما اینجا ما فقط  10 حالت داشتیم ! یک روش برای فشرده کردن این فایل، این هست که یک جدول رو جایی نگه  داریم. یعنی توو اول فایل ، یک جدول مثل این رو دخیره کنیم  :
1->6000000
2->6000001
3->6000002
...
10->600009
حالا  به ازای اطلاعات هر ثانیه، به جای اینکه 23 بیت رو ذخیره کنیم، کافیه فقط 4 بیت  داشته باشیم ! به عباری با 4 بیت شما می تونین 16 حالت رو نشون بدین که از 10 حالت  مورد نیاز ما بیشتره ( کمتر از اون 3 بیت هست که 8 حالت رو می تونه نگه داره و چون  از 10 حالت مورد نیاز ما کمتره، قابل استفاده توو این مورد نیست. برای فشرده ترین  حالت، اون حالتی رو در نظر می گیریم که کمتر از اون امکان پذیر نباشه ) . ما این  بار 10 عدد اطلاعات 23 بیتی رو برای جدول اطلاعات، توو اول فایل آوردیم، یعنی  :
10*23
بعد از اون به ازای 3600 ثانیه ای که داریم، هر ثانیه 4 بیت نگه  داشتیم:
3600*4
تعداد بیت کل یعنی : 14630 که معادل 1828.75 بایت می شه !  چیزی حدود یک پنجم فایل اولی !





شاید مثالی که اینجا زدم  کاربردی به نظر نیاد، اما یکی از جاهایی که شما عملا دارین از این روش استفاده می  کنین، فایلهای GIF و فایلهای BMPی هست که به روش جدول رنگ ذخیره شدن ( یک فایل با  پسوند BMP در انواع حالتها می تونه ذخیره بشه ! )
برای نگهداری یک عکس توو  کامپیوتر اون رو به نقاط ریزی کنار هم تبدیل می کنن. هر نقطه توسط 3 نور اصلی ساخته  می شه، سبز قرمز آبی. به ازای هر کدوم از این نقاط، معمولا 1 بایت در نظر گرفته  میشه. یعنی به فرض نقطه قرمز در تاریک ترین حالت ، در بایت مربوط به خودش عدد 0 رو  میبینه و در روشن ترین حالت عدد 255.
پس وقتی نقاط رو بدون فشرده سازی نگه می  داریم، به ازای هر نقطه می تونیم 16777216 رنگ مختلف رو داشته باشیم ! فرض کنین  عکسی دارین که از 600*800 نقطه تشکیل شده ، اگر بدون فشرده سازی این عکس رو نگه  داریم، 600*800*3 بایت نیاز هست. حدود 1440000 بایت. یا یک فلاپی کامل !
بیاین  فرض کنیم از آسمون ابری عکسی گرفتیم، این عکس چون یا سفیدی ابر هست یا آبی بودن  آسمان، ممکنه در کل از 200 رنگ هم تشکیل نشده باشه ! ما امکان نگهداری 16میلیون رنگ  رو داریم، اما عملا 200 تای اونها استفاده شده. با روش که گفتم اول 200 عدد رنگ 3  بایتی رو نگه می دارن، بعد به ازای هر نقطه فقط 1 بایت ذخیره می شه ! یعنی  200*3+600*800 که 480200 بایت یا یک سوم حجم قبلی می شه ...
مرا امداد کسان افکنده بود از پای ............. مدد از بی کسی ها جستم و امداد خود کردم

آفلاین Modj

  • مدیر سایت
  • ***
  • ارسال: 1146
    • ديدن مشخصات
    • موج
پاسخ : نحوه فشرده سازی اطلاعات
« پاسخ #2 : ۱۷ فروردین ۱۳۸۸ - ۱۹:۴۷:۰۸ »
روش دوم این هست که ما فایلی رو داریم که بایتهایی ( تنوع این بایتها زیاده بر خلاف روش قبلی، اما پراکندی اونها هم زیاده ) به صورت رندوم، پشت سر هم تکرار شدن .
فرض کنین اطلاعات به صورت زیر هست :
111111111155555555777666666666644
توو این روش برای فشرده کردن این فایل، میان فایل فشرده شده حاصل رو به این شکل می سازن که اولین بایت اون فایل، شامل تعداد دفعاتی هست که بایت دوم تکرار شده، سومین بایت شامل تعداد دفعاتی هست که بایت چهارم تکرار شده و الی آخر . یعنی اگر فایل فشرده نشده ما، شامل اطلاعاتی باشه که بالا گفتم، فایلی که به عنوان فشرده از روی این اطلاعات ساحته میشه، چیزی مثل شکل زیر هست :
1 10 5 8 7 3 6 10 4 2
فایل اصلی 33 بایتی بود، فایلی که از روی اون ساخته شد فقط 10 بایت داره ! کمتر از یک سوم فایل اصلی !
مرا امداد کسان افکنده بود از پای ............. مدد از بی کسی ها جستم و امداد خود کردم

آفلاین Modj

  • مدیر سایت
  • ***
  • ارسال: 1146
    • ديدن مشخصات
    • موج
پاسخ : نحوه فشرده سازی اطلاعات
« پاسخ #3 : ۱۷ فروردین ۱۳۸۸ - ۱۹:۴۷:۱۴ »
عملا امروزه از ترکیب این 2 روش استفاده می شه، به علاوه اینکه روش رو متغیر در نظر میگیرن. یعنی برنامه فشرده گر اول یکبار کل اطلاعات فایل رو چک می کنه،از روی اون بهترین روش رو انتخاب می کنه، بعد عمل فشرده سازی رو شروع می کنه.
اصولا روشهای فشرده سازی یا یک جدولی هستن که تعداد بیتهای مورد نیاز اطلاعات رو کمتر می کنه یا تعداد تکرار هستن ! فقط روی فایل مورد نظر  ، اینکه به فرض جدولی که نگه داشتیم چند اطلاعات رو نگه داره باید تخمین زده بشه
مرا امداد کسان افکنده بود از پای ............. مدد از بی کسی ها جستم و امداد خود کردم

آفلاین Modj

  • مدیر سایت
  • ***
  • ارسال: 1146
    • ديدن مشخصات
    • موج
پاسخ : نحوه فشرده سازی اطلاعات
« پاسخ #4 : ۱۷ فروردین ۱۳۸۸ - ۱۹:۴۷:۲۱ »
یکی دیگه از روشها که کاربرد کمتری داره، نگه داشتن تغییرات نسبت به اطلاعات قبلی هست. توو فیلمها به فرض می شه تفاوت فریم های پشت سر هم رو نگه داشت !
فرض کنین توو مثالی که اعداد 6000000 تا 6000009 رو نگه می داشتیم، توو اول فایل، اولین عدد رو نگه داریم، از اون به بعد فقط به ازای هر اطلاعات، یک عدد 5 بیتی شامل تغییر این بایت نسبت به بایت قبلی رو بگذاریم، یعنی اطلاعاتی مثل :
6000009 6000005 6000008 ....
رو به صورت :
6000009 -4 +3 ....
نگه داریم !
مرا امداد کسان افکنده بود از پای ............. مدد از بی کسی ها جستم و امداد خود کردم

آفلاین Modj

  • مدیر سایت
  • ***
  • ارسال: 1146
    • ديدن مشخصات
    • موج
پاسخ : نحوه فشرده سازی اطلاعات
« پاسخ #5 : ۱۷ فروردین ۱۳۸۸ - ۱۹:۴۷:۳۰ »
روشهای بالا برای فشرده سازی توو فایلهایی هست که نمی خوایم حتی 1 بایت از اون رو از دست بدیم، اما همونطور که گفتم گاهی پیش می اد اگر بخشی از اطلاعات رو خذف کنیم، فایل خیلی خیلی فشرده تر بشه، به جاش اطلاعات خیلی زیادی رو هم از دست نداده باشیم !
فرض کنین می خواین اطلاعات همون عکسی که از ساحل دریا هست رو نگه دارین اما متوجه میشین که 260 رنگ تووی عکس استفاده شده. همه اینها رنگهای سفید و آبی در شدتهای مختلف هستن، به فرض 2 رنگ آبی که از لحاظ شدت روشنایی پشت سر هم هستن.
اگر شما بخواین 260 رنگ رو نگه دارین ، به ازای هر نقطه باید 9 بیت رو نگه دارین، اما اگر 4 رنگ رو صرف نظر کنین ( یعنی مثلا جای همه آبی هایی که نزدیک به هم هستن، از یکی شون استفاده کنین ) برای دخیره این اطلاعات کافیه فقط 8 بیت رو نگه دارین، اگر تعداد نقاط تصویر زیاد باشه ، حجم فایل زیادی رو کم کردین ! اما عملا چشم غیر مصلح اگر به این عکس نگاه کنه، احتمالا متوجه تفاوت آنچنان ( یک آبی به جای 4 رنگ آبی که خیلی نزدیک به هم بودن ) نشه !


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

توو فایل JPG به ازای چند نقطه کنار هم(مثلا هر 4 نقطه ) ، اطلاعات رنگ فقط یکی از نقاط نگه داشته میشه، به ازای بقیه نقطه ها ( مثلا 3 نقطه مونده ( این روش ممکنه حتی برای 32 نقطه به بالاتر هم به کار بره ) ) فقط اطلاعات میزان روشنایی بودن اونها نگه داشته میشه ! نظر به اینکه به فرض تمام نقاط کاپشن قهوه ای هستن، اطلاعات رنگ نگه داشته شده کافیه، و با داشتن شدت روشنایی ها خیلی راحت بقیه نقاط به دست میاد. اما توو گوشه ها دچار مشکل میشیم. یعنی چون به فرض ممکنه شخص کاپشن قهوه ای داره اما جلوی دیوار آبی رنگی ایستاده، توو جاهایی که خطوط بین کاپشن و دیوار هستن، اطلاعات رنگ بعضی نقاط صحیح نیست ! این امر همون دلیل وجود لکه های رنگی در گوشه های عکسهایی هست که با فرمت JPG ذخیره شدن !
حتما دیدین که یک عکس فشرده شده با فرمت JPG نسبت به یک عکس فشرده نشده خیلی خیلی حجم کمتری داره، با وجودی که لکه های رنگی به وجود اومده و بخشی از اطلاعات رو از دست دادیم، اما فشرده سازی ای که انجام شده کاملا ارزشمند بوده ...
مرا امداد کسان افکنده بود از پای ............. مدد از بی کسی ها جستم و امداد خود کردم

آفلاین Modj

  • مدیر سایت
  • ***
  • ارسال: 1146
    • ديدن مشخصات
    • موج
پاسخ : نحوه فشرده سازی اطلاعات
« پاسخ #6 : ۱۷ فروردین ۱۳۸۸ - ۱۹:۴۷:۴۴ »
توو بعضی موارد، به بخشی از فایل نیاز هست، فقط برای اعلام این موضوع که فایل وجود داره.
به عنوان مثال گیم های جدید که حجم زیادی دارن،دارای فایلهای صوتی بزرگی هم هستن،اما اینکه اون فایل صوتی به طور کامل و 100% وجود داشته باشیه لازم نیست ! اگر بخوان حجم گیم رو برای دانلود کم کنن،توو فایل فشرده شده فقط اسم فایلهای صوتی و حجم اونها رو می گنجونن. اینطوری وقتی قرار هست فایلهای گیم باز بشه، فایلی با اون اسم اما با اطلاعاتی که نیاز نیست حتما درست باشه ایجاد میشه.گیم با حجمی خیلی خیلی کم کار می کنه، فقط شما صدا ها رو نمی شنوین ! یا دموهای اون پخش نمی شه ...

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

آفلاین Modj

  • مدیر سایت
  • ***
  • ارسال: 1146
    • ديدن مشخصات
    • موج
پاسخ : نحوه فشرده سازی اطلاعات
« پاسخ #7 : ۱۷ فروردین ۱۳۸۸ - ۱۹:۴۷:۵۰ »
اگر مثالی از فایلی که حجم اون خیلی کم شده خواستین، خیلی راحت PAINT ( برنامه نقاشی ویندوز ) رو باز کنین، در تصویر خالی و کاملا سفیدی که هست، CTRL+E رو بزنین، توو پنجره ای که ظاهر میشه،حجم بالایی برای طول و عرض عکس در نظر بگیرین، مثلا6000*4000 نقطه ! فایل رو با فرمت پیشفرض ( BMP که 24 بیتی هست ) ذخیره کنین. فایلی با حجم خیلی بالا ( برای مثالی که گفتم حدود 60-70 مگ ) خواهید داشت، حالا نتیجه ZIP و RAR کردن این فایل خیلی جالب خواهد بود ...
مرا امداد کسان افکنده بود از پای ............. مدد از بی کسی ها جستم و امداد خود کردم

Tags: