الگوريتم lzw

afsharan

New Member
سلام
من ميخوام يم فايل gif از طريق ويژوال بيسيك بازكنم از طريق كد نويسي من اطلاعات داخل اين فايل رو خوندم
جاي كه اطلاعات پيكسلها ذخيره شده از الگوريتم lzw استفاده كرده كسي درباره اين الگوريتم اطلاعاتي داره؟
 

the_king

مدیرکل انجمن
سلام
من ميخوام يم فايل gif از طريق ويژوال بيسيك بازكنم از طريق كد نويسي من اطلاعات داخل اين فايل رو خوندم
جاي كه اطلاعات پيكسلها ذخيره شده از الگوريتم lzw استفاده كرده كسي درباره اين الگوريتم اطلاعاتي داره؟

الگوریتم مشهوریه و در عین حال از نظر پیاده سازی ساده است :

Save StdPictures (BMPs) in .GIF Format with Optional Transparency

Lempel–Ziv–Welch (LZW) - Wikipedia

البته با توجه به اینکه +GDI در تمامی ویندوز های XP به بعد وجود داره، نیازی به کد نویسی خاصی برای خواندن یا
نوشتن اطلاعات تصاویر GIF ندارید و می توانید از کتابخانه +GDI استفاده کنید. در کد برنامه مرور گر تصویر من یک ماژول
GDIPlus.bas وجود دارد که خواندن و نوشتن تصاویر JPEG و GIF و PNG و TIFF و ... را با +GDI انجام می دهد،
می توانید از آن ماژول استفاده کنید :

یک مرورگر تصویر به زبان ویژوال بیسیک
 

afsharan

New Member
سلام
من رشتم الكترونيك و كمي هم ويژوال بيسيك ياد دارم من ميخوام يك فايل gif رو به كد تبديل كنم و در تابلوهاي
led اين فايل رو نمايش دهم چه كار بايد بكنم كه فايل gif رو ديكد بكنم
 

the_king

مدیرکل انجمن
سلام
من رشتم الكترونيك و كمي هم ويژوال بيسيك ياد دارم من ميخوام يك فايل gif رو به كد تبديل كنم و در تابلوهاي
led اين فايل رو نمايش دهم چه كار بايد بكنم كه فايل gif رو ديكد بكنم
حتما می دونید که تصاویر GIF حداکثر 256 رنگه هستند، یعنی یک جدول رنگ (Palette) دارند که رنگ های
بکار رفته در تصویر را از داخل آن انتخاب می کنند. حالا بسته به اینکه تابلو های LED شما تکرنگ باشند یا
چند رنگی، خودتان بایستی رنگ ها را معادلسازی کنید، مگر اینکه تصویر GIF ای که بکار می برید از همان
ابتدا همان چند رنگ محدود که تابلو دارد بکار برده باشند.

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

کد زیر یک تصویر C:\Image1.gif را خوانده و آنرا به یک آرایه دو بعدی Bitmap تبدیل می کند، هر خانه از این
Bitmap مقدار 1 دارد به شرطی که رنگ آن نقطه در تصویر gif سفید باشد، وگرنه 0 است.
پس در حقیقت تصویر را به یک آرایه دو بعدی 0 و 1 تبدیل می کند :
کد:
Private Sub Form_Load()
    Dim Pic1 As PictureBox
    Dim Bitmap() As Byte
    Dim X As Long, Y As Long
    Set Pic1 = Me.Controls.Add("VB.PictureBox", "Pic1")
    With Pic1
        .BorderStyle = vbBSNone
        .AutoSize = True
        .AutoRedraw = True
        .ScaleMode = vbPixels
        Set .Picture = LoadPicture("[B]C:\Image1.gif[/B]")
        ReDim Bitmap(0 To .ScaleWidth - 1, 0 To .ScaleHeight - 1)
        For Y = 0 To .ScaleHeight - 1
            For X = 0 To .ScaleWidth - 1
                If .Point(X, Y) = vbWhite Then
                    Bitmap(X, Y) = 1
                Else
                    Bitmap(X, Y) = 0
                End If
            Next
        Next
    End With
End Sub
 

the_king

مدیرکل انجمن
سلام ميشه اين خط رو توضيح بدين

کد:
ReDim Bitmap(0 To .ScaleWidth - 1, 0 To .ScaleHeight - 1)

Bitmap نام آرایه است که در ابتدای کد تعریف شده، اما چون برای آن ابعادی مشخص نکرده بودیم،
بایستی بصورت دینامیک ابعادش را بر اساس ابعاد تصویر GIF تنظیم کنیم.

ScaleWidth طول تصویر GIF است (بر حسب پیکسل) که چون ما اندیس ها را از 0 شروع می کنیم، برای
آخرین اندیس ScaleWidth - 1 را تعیین می کنیم.

به همان ترتیب ScaleHeight عرض تصویر GIF است و برای آخرین اندیس اش ScaleHeight - 1 را بکار می بریم.

مثلا اگر ابعاد تصویر GIF برابر 10 در 20 پیکسل باشد، آنگاه Bitmap به این شکل ایجاد می گردد :

کد:
ReDim Bitmap(0 To 9, 0 To 19)
 

afsharan

New Member
سلام
منون از همكاري شما
ببخشيد سواد برنامه نويسيvb من پاينه اين خط رو هم توضيح بدين

Set Pic1 = Me.Controls.Add("VB.PictureBox", "Pic1")
 

the_king

مدیرکل انجمن
سلام
منون از همكاري شما
ببخشيد سواد برنامه نويسيvb من پاينه اين خط رو هم توضيح بدين

Set Pic1 = Me.Controls.Add("VB.PictureBox", "Pic1")

در زمان اجرای کد (Runtime)، یک کنترل PictureBox با نام Pic1 را روی فرم قرار می دهد، البته Visible آن کنترل
False خواهد بود و دیده نمی شود.
 

afsharan

New Member
سلام
برنامه اي كه شما نوشتين خيلي برام مفيد بود با اين برنامه من يك عكس رو ميتونم بخونم حالا اگه يك فايل متحرك gif (انيميشن) باشه
چه كار بايد كرد
 

the_king

مدیرکل انجمن
سلام
برنامه اي كه شما نوشتين خيلي برام مفيد بود با اين برنامه من يك عكس رو ميتونم بخونم حالا اگه يك فايل متحرك gif (انيميشن) باشه
چه كار بايد كرد

کنترل های استاندارد تصویری فقط اولین فریم GIF های متحرک را نمایش می دهند، به همین جهت برای دریافت
اطلاعات بقیه فریم ها قابل استفاده نیستند. برای اینکه سایر فریم ها را نمایش دهیم، از یک کنترل WebBrowser
که حقیقتا یک پنجره Internet Explorer است، استفاده خواهیم کرد. WebBrowser می تواند یک تصویر GIF متحرک
را نمایش دهد. زمانی که تصویر نمایش پیدا کرد، می توانیم هر لحظه از تصویر آن عکس گرفته و به داخل یک
PictureBox منتقل کنیم. بقیه مراحل مشابه همان حالتی خواهد بود که یک تصویر عادی درون PictureBox قرار گیرد.

کد برنامه پیوستی یک تصویر GIF متحرک را در داخل یک کنترل WebBrowser نمایش می دهد. هر زمانی که دکمه
Get Frame را فشار دهید، از تصویر متحرک عکس گرفته می شود و در حافظه آرایه Bitmap قرار می گیرد.
برای آنکه صحت عملکرد روتین مشخص شود، یک روتین دیگر به نام ShowFrame ایجاد کردم تا آرایه Bitmap
را روی فرم نشان دهد.

کد کامل برنامه به همراه فایل اجرایی exe ضمیمه این پست می باشد.
 

پیوست ها

  • Animated GIF.zip
    24.4 کیلوبایت · بازدیدها: 16

afsharan

New Member
سلام
در اين WebBrowser ميشه هر فريم رو تشخيص داد كه خودكار از آن عكس بگير و كدها رو استخراج كنه
 

the_king

مدیرکل انجمن
سلام
در اين WebBrowser ميشه هر فريم رو تشخيص داد كه خودكار از آن عكس بگير و كدها رو استخراج كنه

نه به اون شکل، ما از بیرون از کنترل WebBrowser به مشخصات و موقعیت و تعداد فریم ها دسترسی ای نداریم
و طبیعتا نمایش یک فریم جدید هم به برنامه اعلام نخواهد شد.

برای تشخیص خودکار یک فریم جدید، یک راهی به ذهنم می رسه که قطعا عملی است، اما راه حل چندان
مناسبی نیست :

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

جدیدترین ارسال ها

بالا