التنبيهات التالية ظهرت :
Warning [2] count(): Parameter must be an array or an object that implements Countable - Line: 864 - File: showthread.php PHP 7.4.33 (Linux)
File Line Function
/showthread.php 864 errorHandler->error



تقييم الموضوع :
  • 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


الردود في هذا الموضوع
كيف تعرض Thumbnail للملفات - بواسطة الشاكي لله - 02-11-13, 10:05 PM
RE: كيف تعرض Thumbnail للملفات - بواسطة ali.alfoly - 02-11-13, 10:39 PM
RE: كيف تعرض Thumbnail للملفات - بواسطة Sajad - 03-11-13, 08:01 PM
RE: كيف تعرض Thumbnail للملفات - بواسطة Nour - 17-01-14, 03:50 AM

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


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