تقييم الموضوع :
  • 2 أصوات - بمعدل 5
  • 1
  • 2
  • 3
  • 4
  • 5
[مقال] كيف تعرض Thumbnail للملفات
#1
السلام عليكم ورحمة الله وبركاته



Thumbnail او الصور الرمزية هي صور تشير الى محتوى الملف

لنأخذ بالمثال الكتب الاكترونية ذات الامتداد (PDF.)





كما ترى الملف dotNet 2008 يوجد لديه Thumbnail وهو يشير الى غلاف

الكتاب
.





--
--
--




طيب لو انا سويت امتداد جديد (مثلا cfg) ، وسويت ملف بهذا الامتداد

كيف سيعرض هذا الملف !!!





لو انا حبيت احط صورة رمزية Thumbnail يعبر عن محتوى هذا الملف

كما حصل في الملف dotNet 2008 ..


كيف سأقوم بذلك ؟؟




--
--
--




هناك مكتبة تدعى SharpShell وهي مكتبة متخصصة في هذا الموضوع

سنكتب بواسطتها كود يقوم باستخراج صورة من الملف نفسه (الذي بالامتداد cfg)

كما في dotNet 2008 حيث ان الوندوز قام باخذ اول صفحة من الكتاب وجعلها

Thumbnail له .


اذن الThumbnail يتم سحبه من الملف نفسه . فيجب عليك البحث عن طريقة

لحفظ الصورة في الملف .. مثلا اخونا سجاد في شرحه لxml

حيث انه استعمل طريقة لحفظ صورة في ملف xml ..

فيمكننا مثلا ان نقوم بعمل Thumbnail للملف xml من خلال بيانات الصورة الموجودة داخله .


في هذا المقال .. راح نسوي ملف نصي ونضع في اول سطر رابط لصورة موجودة على الانترنت ونحفظ الملف كالامتداد cfg

وسيقوم الThumbProviderبتحميل الصورة من الرابط ويضعها ك Thumbnail للملف

اتمنى وضحت الفكرة.





--
--
--




طيب نجي للتطبيق :-


[color=#4B0082[/color]]اولا : يجب ان يكون لديك Visual studio 2010 او 2010 #C او حتى فيجوال

بيسك 2010

ولكن عليك بتحويل الكود الى الفيجوال بيسك لان المقالة تعتمد على السي شارب

..

ثانيا : إنشاء مشروع جديد باسم ThumbProvider من نوع Class library

..

ثالثا : اضف المكتبات الضرورية ك System.Drawing و SharpShell

--

رابعا : الكود سيكون بهذه الطريقة :-[/color]

PHP كود :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using SharpShell.Attributes;
using SharpShell.SharpThumbnailHandler;
using System.Drawing;
using System.IO;
using System.Net;

namespace 
ThumbProvider
{
    public class 
ThumbProvider
    
{
        
/// <summary>
        /// The TxtThumbnailHandler is a ThumbnailHandler for .cfg files.
        /// </summary>
        
[ComVisible(true)]
        [
COMServerAssociation(AssociationType.FileExtension".cfg")]
        [
Guid("38b1b369-87c0-381c-b37e-cba4909de666")]
        public class 
ThumbnailHandler SharpThumbnailHandler
        
{

            
/// <summary>
            /// Gets the thumbnail image.
            /// </summary>
            /// <param name="width">The width of the image that should be returned.</param>
            /// <returns>
            /// The image for the thumbnail.
            /// </returns>
            
protected override Bitmap GetThumbnailImage(uint width//Add System.Drawing
            
{
                
//  Attempt to open the stream with a reader.
                
try
                {
                    
using (StreamReader  reader = new StreamReader(SelectedItemStream))
                    {
                        
WebClient wc = new WebClient();
                        
byte[] imgData wc.DownloadData(reader.ReadLine());
                        
MemoryStream ms = new MemoryStream(imgData);
                        
Image thumb Image.FromStream(ms);
                        return (
Bitmap)thumb;
                    }
                }
                catch (
Exception exception)
                {
                    
//  Log the exception and return null for failure.
                    
LogError("An exception occured opening the text file."exception);
                    return 
null;
                }
            }



        }
    }



الدالة GetThumbnailImage هي المسؤولة عن إستخراج صورة (Tumb) ووضعها للملف

هذه الدالة يقوم بطلبها مستكشف الوندوز Windows Explorer للغرض المذكور اعلاه .



--
--
--


نأتي لشرح الاسطر المهمة في هذا الكود

PHP كود :
[COMServerAssociation

(AssociationType.FileExtension".cfg")]
        [
Guid("38b1b369-87c0-381c-b37e-cba4909de666")] 

لاحظ قمنا بوضع cfg. اي ان هذا المشروع كله لكي يجلب Thump فقط للملفات ذات

الامتداد cfg. فإذا كان امتدادك باسم اخر استبدله بهذا الامتداد.


..

Guid : كما جرت العادة في مكتبات COM حيث يجب تعريف دليل للكلاس

حيث يجب ان يكون هذا الكلاس من نوع COM وذلك لأن الوندوز لايقبل سوى COM

في الواقع كتابة هذا المشروع طويل ومتعب .. لكن بفضل مكتبة SharpShell

قمنا بكتابة الThumpProvider بكل سهولة وبواسطة دالة واحدة فقط



--

PHP كود :
using (var reader = new StreamReader(SelectedItemStream)) 


الشيئ المهم في هذا الكود هي الخاصية SelectedItemStream

فهي خاصية يتم اسناد القيمة اليها من خلال Windows Explorer

وهي عبارة عن Stream للملف ، والكل يعرف Stream (التي من خلالها نستطيع قرائة/كتابة) ملف

--

الكود المسؤول عن اعطاء thumbnail للملف هو هذا :-

PHP كود :
WebClient wc = new WebClient();
                        
byte[] imgData wc.DownloadData(reader.ReadLine());
                        
MemoryStream ms = new MemoryStream(imgData);
                        
Image thumb Image.FromStream(ms);
                        return (
Bitmap)thumb

وظيفة الكود هو اخذ اول سطر من الملف الي المفروض يكون رابط لصورة ، ويقوم بتحميل الصورة

ثم إرجاع الصورة .. وفور ارجاع الصورة ال Windows explorer ، سيقوم بعرضها على الملف .



--
--
--


الان بقي شيئ واحد وهو تسجيل الThumpProvider الي سويناه + تنصيبه

لكي يستطيع الWindows Explorer استدعائه عندما يريد عرض Tumpnail

لاحد الملفات ذات الامتداد cfg

ولكن اولا سنقوم بعمل Strong name للمشروع

وذلك من خلال My Project > Signing > (check) sign

this assemble واكتب اي اسم

كما في الصورة :-




وبعدها سو Build لينتج لنا ملف ThumbProvider.dll



--
--
--


الان قبل تسجيل الThumbProvider.dll على الوندوز سنقوم بتجريبه

هل سيقوم بعرض Thumbnail للملفات cfg او لا.

في البداية علينا فتح النوت باد وكتابة رابط لصورة



بعدها نحفظ الملف بصيغة cfg





..


الان علينا بتجريب المشروع ThumbProvider بالاحرى ملف ThumbProvider.dll

سنقوم باستعمال الاداة ServerManager.exe المرفقة




نقوم باضافة ملف ThumbProvider.dll من خلال File > Open


وبعد الاضافة نقوم بتجريب الThumbProvider من خلال Test Server in test shell




وبعدها ننزل وندور على الملف الي سويناه قبل شوي (test.cfg) ، والمفاجئة :




تماااام قام بتحميل الصورة من خلال الرابط الموجود في الملف ثم عرضهاCool

الان نحتاج نشوفها على ارض الواقع . اي على Windows explorer

لهذا علينا تسجيل الThumpProvider وتنصيبه .. نقوم بذلك من خلال الاداة نفسها :




الان لتطبيق التغيرات في النظام عليك بعمل Restart للجهاز

نسوي ريستارت ونرجع ..[/color]


--
--
--


عدنا ..

الان لو تروح للملف الي سويناه (test.cfg) مابتشوف حصل شيئ فيه

ولا اعلم السبب صراحة . (اعتقد ان الملف المفروض مايكون موجود قبل التسجيل)

لذلك قم بحذفه واعد الخطوات


إقتباس :

بعدها نحفظ الملف بصيغة cfg


ستلاحظ ظهور الThumb اخيرااااBig Grin





واذا تريد التأكد اكثر . قم بعمل ملف cfg مرة ثانية يحتوي على رابط لصورة اخرى

والنتيجة :-




وتنتهي الحكاية Smile



--
--
--



الحين انت بتسألني بتقول "لو حبيت انشر برنامجي الى المستخدمين هل سأقول لكل شخص ان يقوم بتنزيل ServerManger ويقوم بتسجيل الThumpProvider"

فكما تتذكرون احنا قمنا بتسجيل الThumpProvider من خلال البرنامج





اذن كيف أستطيع تسجيل وتنصيب ال Provider من خلال الكود (برمجيا) ؟؟ :

بعد عدة محاولات استطعت اخيرا تنفيذ هذه العملية بواسطة دالتين

دالة لتسجيل الProvider والاخرى لتنصيبه :
PHP كود :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32;
using System.ComponentModel.Composition.Hosting;



        
bool Register(string extension ,string Guid)
        {
            try
            {
                
//تسجيل الملف register
                
RegistryKey rBaseKey Registry.ClassesRoot.CreateSubKey(extension,
                    
RegistryKeyPermissionCheck.ReadWriteSubTree).CreateSubKey("shellex"RegistryKeyPermissionCheck.ReadWriteSubTree);
                
RegistryKey rChildkey rBaseKey.CreateSubKey("{e357fccd-a995-4576-b01f-234630154e96}",
                    
RegistryKeyPermissionCheck.ReadWriteSubTree);
                
rChildkey.SetValue("""{" Guid "}");

                
rBaseKey.Close();
                
rChildkey.Close();

                return 
true;
            }
            catch (
Exception ex)
            {
                
MessageBox.Show(ex.Message"Error"MessageBoxButtons.OKMessageBoxIcon.Error);
                return 
false;
            }
        }

        
bool Installer(string assamblyPathstring Guid)
        {
            
//التنصيب install
            
try
            {
                
AssemblyCatalog catalog = new AssemblyCatalog(assamblyPath);
                
Type cls = (Type)catalog.Assembly.GetTypes().Where(=> t.GUID.ToString() == Guid).First();

                
RegistryKey iBaseKey Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Classes\CLSID\" + "{" + Guid + "}",
                    RegistryKeyPermissionCheck.ReadWriteSubTree);
                RegistryKey iChildKey = iBaseKey.CreateSubKey("
InprocServer32", RegistryKeyPermissionCheck.ReadWriteSubTree);
                iChildKey.SetValue("", "
mscoree.dll");
                iChildKey.SetValue("
Assembly", catalog.Assembly.FullName);
                iChildKey.SetValue("
Class", cls.FullName);
                iChildKey.SetValue("
CodeBase", @"file:///" + assamblyPath);
                
iChildKey.SetValue("RuntimeVersion"catalog.Assembly.ImageRuntimeVersion);
                
iChildKey.SetValue("ThreadingModel""Both");
                
//
                //
                
RegistryKey iLastKey iChildKey.CreateSubKey("1.0.0.0"RegistryKeyPermissionCheck.ReadWriteSubTree);
                
iLastKey.SetValue("Assembly"catalog.Assembly.FullName);
                
iLastKey.SetValue("Class"cls.FullName);
                
iLastKey.SetValue("CodeBase", @"file:///" assamblyPath);
                
iLastKey.SetValue("RuntimeVersion"catalog.Assembly.ImageRuntimeVersion);

                
iBaseKey.Close();
                
iChildKey.Close();
                
iLastKey.Close();

                return 
true;
            }
            catch (
Exception ex)
            {
                
MessageBox.Show(ex.Message"Error"MessageBoxButtons.OKMessageBoxIcon.Error);
                return 
false;
            }
        } 


وهذا هو التطبيق




الامتداد + الدليل . تحصل عليه من الكود الي كتبناه سابقا في ThumbProvider

بالتحديد هذا الكود :-

PHP كود :
[COMServerAssociation

(AssociationType.FileExtension".cfg")]
        [
Guid("38b1b369-87c0-381c-b37e-cba4909de666")] 




--
--
--




إلى هنا تنتهي المقالة

اتمنى انها كانت خفيفة عليكم


المرجع :


NET Shell Extensions - Shell Thumbnail Handlers


((هذا الموضوع اهداء الى ali.alfoly)))



الملفات المرفقة
.zip   ThumbProvider.zip (الحجم : 141.09 ك ب / التحميلات : 153)
.rar   Server Manager.rar (الحجم : 141.27 ك ب / التحميلات : 151)
.zip   Shell Thumb Installer.zip (الحجم : 90.75 ك ب / التحميلات : 143)
الرد }}}
تم الشكر بواسطة: yahya , ali.alfoly , Sajad , AHMED HUSSIEN , hoob computer , tariq2812 , kslawy , Japan
#2
السلام عليكم ورحمة الله

تعجز الكلمات امام هذا الجهد والابداع الكبير من اخ محترف

لا استطيع ان اجزيك شئ وجزاك الله خيرا

اسئل الله تعالي ان يبارك لك في علمك

ويجمعنا بك في جنات النعيم
مع النبي الامين صلي الله عليه واله وصحبه وسلم

جاري احلي تقيم لاحلي موضوع
الرد }}}
تم الشكر بواسطة: الشاكي لله
#3
(02-11-13, 10:39 PM)ali.alfoly كتب : السلام عليكم ورحمة الله

تعجز الكلمات امام هذا الجهد والابداع الكبير من اخ محترف

لا استطيع ان اجزيك شئ وجزاك الله خيرا

اسئل الله تعالي ان يبارك لك في علمك

ويجمعنا بك في جنات النعيم
مع النبي الامين صلي الله عليه واله وصحبه وسلم

جاري احلي تقيم لاحلي موضوع

الحمدلله

--


لكل من نزل Shell Thumb Installer.zip .. تم تعديله

فالرجاء تنزيله من جديد
الرد }}}
تم الشكر بواسطة:
#4
السلام عليكم

بارك الله فيك وزادك علما نافعا

تحياتي
الرد }}}
تم الشكر بواسطة: الشاكي لله
#5
الله يبارك فيك أخي العزيز,

شكلي ححول على السي شارب Smile


تحياتي
الرد }}}
تم الشكر بواسطة: الشاكي لله
#6
(14-11-13, 03:34 PM)hoob computer كتب : الله يبارك فيك أخي العزيز,

شكلي ححول على السي شارب Smile


تحياتي

ههه عادي تقدر تطبق الدرس على الفيجوال بيسك

بقولك ويش الي خلاني انتقل للسي شارب

هما 3 اسباب فقط :

1- المؤشرات وUnsafe code : وهو انواع غير موجودة في الفيجوال بيسك تمكنك هذه الانواع من التعامل مع الذاكرة .. حيث اني كنت سابقا اتعامل مع الاسمبلي فأحب التعامل مع هذه الامور

2- محركات الالعاب : قبل سنين قررت اسوي لعبة ، وبالطبع عند الحديث عن الالعاب لابد لك ان تختار محرك لكي تنتج لك لعبة ، unity3d محرك الثلاثي الابعاد المشهور يدعم لغة السي شارب والجافا وسي++ . فكان من المستحيل ان ابرمج لعبة بالفيجوال بيسك بهذا المحرك
، المحرك الوحيد الذي يدعم الفيجوال بيسك هو Visual3D ، طبعا انا اتكلم عن ال3d فقط .


Unity3D



Visual3D




طبعا Unity3D محرك قوي ومشهور يمكنه برمجة الالعاب لـ Wii , PC , XBOX , Iphone , Android , PS3 , PS4 .. بعكس الvisual3D الذي يدعم الPC , Xbox فقط
(ولكن لكي تصمم العاب للكونسول (PS4 ,PS3) يجب عليك شراء Template من Sony اولا )


3- المصادر الهائلة لسي# : اكبر مثال هو هذا المقال الذي لايتوفر على الفيجوال بيسك
. اتحداك تحصل مقال يشرح Shell extension للفيجوال بيسك

حيث انها تحتل المركز الخامس ضمن "اللغة الاكثر شعبية"



بينما الفيجوال بيسك دوت نت تحتل المركز 11

..

لاحظ جميع لغات عائلة الC هي الاكثر استخداما وشهرة .. واحد الاسباب طريقة الكتابة التي تروق لبعض المبرمجين المخضرمين

.
الرد }}}
تم الشكر بواسطة: hoob computer
#7
والله يا أخي كلامك مضبوط و 100% صح, لكن أجد البرمجة بالسي شارب صعبة قليلاً لكثرة علامات { و } ههههههههه

مع العلم, ايام الكلية و الجامعة كنت متفوق جداً في السي ++ و كنا في الجامعة نصمم برامج لا بأس بها في السي ++.
و لكنني عندما أستخدمت الفيجوال بيسك أعجبني جداً لسهولته و مرونته في التعامل مع الادوات ... و لكن عندما أرى مقالات في السي شارب .. افكر لماذا لا انتقل إليها و إلى LINQ To SQL N Tier ؟

المشكلة في الوقت الذي أحتاجه لإتقانها ... يجب أن أبدء من البداية كي لا افوت أي شيء.
و لكن هنالك أحتمال أن احول إليها إن شاء الله لقوتهما في البرمجة و لأمانهما الأعلى من الفيجوال بيسك...

على العموم, إدعيلي يا أخي أحول إليها في أقرب وقت ممكن Smile
جزاك الله خيراً

تحياتي
الرد }}}
تم الشكر بواسطة:
#8
(14-11-13, 04:48 PM)hoob computer كتب : والله يا أخي كلامك مضبوط و 100% صح, لكن أجد البرمجة بالسي شارب صعبة قليلاً لكثرة علامات { و } ههههههههه

مع العلم, ايام الكلية و الجامعة كنت متفوق جداً في السي ++ و كنا في الجامعة نصمم برامج لا بأس بها في السي ++.
و لكنني عندما أستخدمت الفيجوال بيسك أعجبني جداً لسهولته و مرونته في التعامل مع الادوات ... و لكن عندما أرى مقالات في السي شارب .. افكر لماذا لا انتقل إليها و إلى LINQ To SQL N Tier ؟

المشكلة في الوقت الذي أحتاجه لإتقانها ... يجب أن أبدء من البداية كي لا افوت أي شيء.
و لكن هنالك أحتمال أن احول إليها إن شاء الله لقوتهما في البرمجة و لأمانهما الأعلى من الفيجوال بيسك...

على العموم, إدعيلي يا أخي أحول إليها في أقرب وقت ممكن Smile
جزاك الله خيراً

تحياتي

اذا كنت متفوق بالسي++

فالمفروض ترتاح مع السي شارب

نفس القواعد .. فاصلة في النهاية ، اقواس {} ، Pointers ....

انا ايضا برمجت بالسي++ .. وبعدين شفت الفيجوال بيسك مرنة وسهلة

وبعدين سي شارب

والان ماشي الحال وخاصة مع WPF الحلوةBig Grin
الرد }}}
تم الشكر بواسطة:
#9
هههههه

و الله يا أخي العزيز لقد شجعتني على السي شارب Smile

سأحاول بإذن الله البدء بتعلمها و سأعمل على البدء بشيء بسيط (برنامج بسيط) و من ثم اتعمق بها و سأحاول بإذن الله تحويل مشروعي المكتمل من الفيجوال بيسك إلى السي شارب Smile

هل الـWPF سريعة؟
لقد قمت بعمل مثال عن الـWPF في الفيجوال بيسك و لكنه كان بطيئاً نسبياً! Sad

و عندما أعمل نفس المثال و لكن Windows Form أعتيادي ... يكون أسرع.
لماذا هذا الفرق مع الـWPF؟


تحياتي
الرد }}}
تم الشكر بواسطة:
#10
بصراحة انا ماعندي الخبرة الكافية عن ذلك

لكن شوف هذا الموضوع اكيد بفيدك

http://stackoverflow.com/questions/36837...ms-and-wpf
الرد }}}
تم الشكر بواسطة: hoob computer


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم