روش های ذخیره سازی تصاویر

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

این یادداشت توضیح می دهد که داده های Clipboard را چگونه به کمک سی شارپ مدیریت و در فایل ذخیره کنیم.
در این نوشته من از کلاس System.Windows.Forms.Clipboard استفاده خواهم کرد.

این کلاس متدهایی برای قرار دادن و بازیابی اطلاعات موجود در Clipboard برای ما فراهم می کند.
تمام متدهای فراهم شده توسط این کلاس استاتیک هستند به این معنی که برای استفاده از آن ها نیازی ندارید که یک شی از این کلاس بسازید.

و اما کد برنامه
كد:
if (Clipboard.GetDataObject() != null)
{
IDataObject data = Clipboard.GetDataObject();

if (data.GetDataPresent(DataFormats.Bitmap))
{
Image image = (Image)data.GetData(DataFormats.Bitmap,true);
image.Save(“image.bmp”,System.Drawing.Imaging.ImageFormat.Bmp);
image.Save(“image.jpg”,System.Drawing.Imaging.ImageFormat.Jpeg);
image.Save(“image.gif”,System.Drawing.Imaging.ImageFormat.Gif);
}
else
{
MessageBox.Show(“The Data In Clipboard is not as image format”);
}
}
else
{
MessageBox.Show(“The Clipboard was empty”);
}

حالا توضیح برنامه :
– متد GetDataObject() اطلاعاتی که درون Clipboard هست را نشان می دهد بنابراین می توانیم از آن برای گرفتن داده های درون Clipboard یا چک کردن وجود داده در آن استفاده کنیم.
– چون داده هایی که درون Clipboard قرار می گیرند از انواع داده ای مختلفی هستند این متد یک داده از نوع IDataObject برمی گرداند بنابراین من یک شی از نوع اینترفیس IDataObject ساختم و آن را بوسیله مقدار بازگشتی از تابع etDataObject() مقدار دهی اولیه کردم:
IDataObject data = Clipboard.GetDataObject();

– بعد از این ما می توانیم شی data را برای مدیریت اطلاعاتی که از GetDataObject() یا Clipboard می آیند استفاده کنیم.
– حالا نوع این داده که در شی data قرار گرفته است را بررسی می کنیم:
if (data.GetDataPresent(DataFormats.Bitmap))

یا آن را به یک فرمت مناسب مثل فرمت تصویری تبدیل می کنیم :
Image image = (Image)data.GetData(DataFormats.Bitmap,true);

اگر فرمت داده ما ماهیت تصویری نداشته باشد این مطلب را به کمک یک Message Box به کاربر اعلام می کنیم:
MessageBox.Show(“The Data In Clipboard is not as image format”);
توضیح: منبع این مطلب ، سایت C# Help بود. برای دریافت سورس این برنامه می توانید

ذخيره تصوير کاربران ياهو مسنجر
در صورتي كه از كاربران ياهو مسنجر باشيد، حتما با Avatar يا عكسي كه به هنگام چت كردن در كنار ID افراد نمايش داده مي شود، آشنا هستيد. شما با اين ابزار كه از ياهو مسنجر ۷ افزوده شده است، هنگام چت كردن با طرف مقابل مي توانيد عكسي با اندازه نسبتا كوچك را در صفحه چت خود قرار دهيد. اما به طور طبيعي اين عكس را نمي توان با ياهو مسنجر روي هارد ذخيره كرد و تنها مي توان آن را مشاهده كرد. روشي را به شما معرفي مي كنيم كه در عين سادگي مي توانيد تصوير هر ID را كه بخواهيد، دريافت و روي هارد ذخيره كنيد.
براي اين كار كافي است از طريق مرورگر خود به آدرس www.invisible.ir/dicatcher مراجعه كنيد.اكنون در فيلد yahoo!ID آيدي مورد نظر را وارد و سپس روي دكمه ذره بين كليك كنيد يا Enter بزنيد.پس از چند ثانيه تصوير ID شخص مورد نظر ظاهر مي شود اكنون روي عكس راست كليك و آن را Save كنيد. عكس در همان اندازه استاندارد ياهو مسنجر است، شما مي توانيد به وسيله نرم افزارهاي تخصصي همانند فتوشاپ، تصوير را با كاهش نسبي كيفيت عكس بزرگ تر كنيد.
ذخیره تصاویر در SQL Server
چند روز پیش یکی از دوستانم در دانشگاه از من سوالی در مورد نحوه ذخیره تصاویر در SQL Server پرسید. من می دانستم که نوع داده ای image برای انجام این کار استفاده می شود ولی هیچ گاه از آن استفاده نکرده بودم و بنابراین هیچ ایده ای از نحوه ارسال اطلاعات برای ذخیره شدن در بانک اطلاعاتی نداشتم. فردای آن روز ایمیلی به دوستم زدم و لینک یک مقاله خوب از codeproject را برایش فرستادم که نحوه انجام این کار را توضیح می داد. به نظرم آمد که آن مقاله را برای وبلاگم هم ترجمه کنم. این مقاله یک سورس هم دارد که می توانید آن را از اینجا دانلود کنید.

مرور راه حل
به طور معمول، تصاویر در پوشه های روی وب سرور ذخیره می شوند نه در دیتابیس، این اما برای فایل های با حجم بالاست. در بعضی موارد ، مثلا یک بانک ، آن ها از تصویر امضای مشتری اسکن می گیرند و آن را در بانک اطلاعاتی خود ذخیره می کنند.
– الگوی بانک اطلاعاتی مورد استفاده : مایکروسافت SQL Server 2000 را به عنوان بانک اطلاعاتی استفاده می کنیم، من از نوع داده ای image استفاده خواهم کرد. نوع داده ای image برای ذخیره کردن تصاویر در بانک اطلاعاتی استفاده می شود.
– کنترل هایی که در این برنامه از آن ها استفاده می کنیم عبارتند از : System.Web.UI.HtmlControls.HtmlInputFile و System.Web.UI.WebControls.TextBox و System.Web.UI.WebControls.Button

-و فضا نام هایی که در این برنامه از آن ها استفاده می کنیم عبارتند از: System.Data.SqlClient و System.Drawing و System.Data و System.IO و System.Drawing.Imaging
راه حل همراه با کد
از کلاس HtmlInputFile برای ساختن کنترل آپلود فایل استفاده می کنیم. مثال زیر یک فایل ASPX کامل است که به کاربر این امکان را می دهد که یک تصویر و توضیح آن را آپلود و به بانک اطلاعاتی اضافه کند . متد OnUpload تصویر و توضیح آن را در یک جدول بانک اطلاعاتی SQL Server به نام Pictures در دیتابیس MyData اضافه می کند.
// سورس کد ذخیره تصویر در بانک اطلاعاتی

public void OnUpload(Object sender, EventArgs e)
{
// ساختن یک byte[] از فایل ورودی
int len = Upload.PostedFile.ContentLength;
byte[] pic = new byte[len];
Upload.PostedFile.InputStream.Read (pic, 0, len);

// افزودن تصویر و توضیح تصویر به بانک اطلاعاتی
SqlConnection connection = new
SqlConnection (@”server=127.0.0.1;database=MyData;uid=sa;pwd=yourpass”);
try
{
connection.Open ();
SqlCommand cmd = new SqlCommand (“insert into Image ”
+ “(Picture, Comment) values (@pic, @text)”, connection);
cmd.Parameters.Add (“@pic”, pic);
cmd.Parameters.Add (“@text”, Comment.Text);
cmd.ExecuteNonQuery ();
}
finally
{
connection.Close ();
}
}
تابعی که در بالا معرفی کردیم توسط ویژگی OnClick یک دکمه فراخوانی می شود.
چگونه می توانم یک تصویر را از دیتابیس خوانده و در صفحه وب نمایش دهم؟
اینجا من از یک صفحه وب برای نمایش تصویر استفاده کرده ام، کد زیر برای نمایش تصویر در صفحه وب استفاده می شود
private void Page_Load(object sender, System.EventArgs e)
{
MemoryStream stream = new MemoryStream ();
SqlConnection connection = new
SqlConnection (@”server=127.0.0.1;database=MyData;uid=sa;pwd=yourpass”);
try
{
connection.Open ();
SqlCommand command = new
SqlCommand (“select Picture from Image”, connection);
byte[] image = (byte[]) command.ExecuteScalar ();
stream.Write (image, 0, image.Length);
Bitmap bitmap = new Bitmap (stream);
Response.ContentType = “image/gif”;
bitmap.Save (Response.OutputStream, ImageFormat.Gif);
}
finally
{
connection.Close ();
stream.Close ();
}
}
توابع GDI+ ویژگی های پیشرفته زیادی برای مدیریت و دستکاری داده های تصویری پیشنهاد می کنند. مثال این مقاله نگاه سریعی به کارهایی که از طریق فضا نام های System.Drawing.Imaging و System.Drawing می توانید انجام دهید دارد. به عنوان مثال شما می توانید برنامه را برای ذخیره و مدیریت تصاویر بر روی وب گسترش دهید یا می توانید یک برنامه ساده بنویسید که به کاربر امکان ویرایش و دستکاری تصاویر را می دهد.
چگونه از این کدها استفاده کنیم؟

برای دریافت سورس پروژه اینجا کلیک کنید. ابتدا یک دایرکتوری مجازی بسازید و فایل های پروژه را در آن قرار بدهید ، سپس رشته اتصال به بانک اطلاعاتی را تغییر دهید ( بر اساس سرور و نام کاربری و کلمه عبور و نام دیتابیس خودتان آن را ست کنید ) حالا می توانید از این پروژه استفاده کنید.
امروزه حجم عظيمي از اطلاعات بصورت ديجيتال كد گذاري شده است و ميزان حجم محيط ذخيره سازي مورد نياز افزايش ميابد

بمنظور استفاده موثر از محيط هاي ذخيره سازي بايستي به ميزان معيني از فشرده سازي استفاده شود سيستم هاي فشرده سازي
چه با كاهش كيفي و از دست دادن محدودي از داده ها همراه باشد يا نباشد بدنبال كاهش حجم محيط ذخيره سازي اطلاعات هستند

ميزان كاهش كيفي اطلاعات ناشي از فشرده سازي به بسياري از عوامل و از جمله كاربرد آن بستگي دارد
و ماشينهاي فاكسي مايل پردازنده هاي كلمات را متحول ساختهPC تكنولوژي ديجيتال بسياري از ايستگاههاي كاري كامپيوتر هاي

است
محيط را دگرگون نموده است آخرين مرز و ديوار نسبتآمحكم بازار وسابل خانگي CD در منازل صداي ديجيتال با ساخت و توليد
است حتي ديسك هاي ليزري تصوير نيز آنالوگ هستند و سيستم هاي تلويزيوني كابليVCR دستگاههاي ضبط تصوير آنالوگ
و مدار بسته در شرايط فعلي فقط ويدئو آنالوگ را توزيع و پخش نمايد امروز با فرارسيدن استانداردها و معرفي تكنولوژي هاي
كارآ ويدئو ديجيتال را وعده ميدهد

همراه با تكنولوژي ديجيتال ارتباط متقابل و قابليت اديت بهمان صورتي كه ما اكنون متن نوشته صدا و تصوير هاي گرافيكي را اديت مي كنيم ممكن ساخته است
و ساير سيستمهاي ويدئو كتمپيوتري همه مي توانندويدئوVideo On Demand سيستم چند رسانه اي تلويزيون ديجيتال سيستم
كامپيوتري همه مي توانند ويدئو را در فضاي ديجيتال داشته باشند

 

نگاهي به گذشته آنالوگ
براي روشن شدن وضعيت فعلي لازم است مرور مختصري بر گذشته فضاي آنالوگ داشته باشيم استانداردهاي ويدئو آنالوگ تعداد
فريمهاي تصوير را در هر ثانيه و تعداد خطوط تصوير در هر فريم را معين مي نمايد
سيگنال ويدئو شامل قسمت هاي حياتي است كه براي همزماني استفاده مي شود و بر روي صفحه نمايش داده نمي شود براي تبديل
سيگنال آنالوگ به ديجيتال هر بخش تصويري فعال هر خط نمونه برداري مي شود
و دستگاهاي جديد ديسك ويدئوD1براي سيستم تصوير A13.5 MHz, CCIR-601 ميزان فركانس نمونه برداري مطابق توصيه
استVideo, Cd

اختيار مي شود تعداد ۷۲۰ نمونه از قسمت فعال تصويري هر خط گرفته مي شود كه هر A13.5 MHzوقتي فركانس نمونه برداري
نمونه با ۸ يا ۱۰ بيت نشان داده مي شود
كد گذاري مي گردد معمولآ مولفه هاي تفاضلي رنگها هر كدام نصف فر كانس YUV براي افزايش موثر هر نمونه رنگي در فضاي
نمونه برداري مي شود A6.75 MHzنمونه برداري اصلي يعني با فر كانس

NTSC , PAL ميزان نرخ داده ها در سيستم هاي تلويزيوني
Luminance Y 720*486*29.97*8=83.896819 bit/s

Chrominance U 360*486*29.97*8=41.94141 bit/s

V 360*486*29.97*8=41.94141 bit/s
________________________________________
استF4:2:2 براي انتقال ويدئو ديجيتال در سيستم s 167.79Mbit/s كه نرخ داده هاي نهائي كل
عملآ كانالهاي توزيع از نظر پهناي باند فر كانس محدود هستند و ما ناچار هستيم كه تصاوير ويدئو ديجيتالي را فشرده سازيم تا بتوانيم
مي توانند تا CD-ROM,Video-CDاز نظر زماني همزمان اطلاعات را ارسال و مورد استفاده قرار دهيم براي مثال درايورهاي
مورد نياز است در حاليكه پهناي باند كانال d20:1 مگابيت بر ثانيه انتقال داده ها را انجام دهند در نتيجه فشرده سازي به نسبت v1.4
نياز دارد البته در مراحل g28:1 است كه حد اقل نسبت فشرده سازي d6 Mbit/s ارتباطي يك سيستم تلويزيون كابلي فقط
پردازش صدا نيز بايستي مورد توجه قرار گيرد
بمنظور هماهنگي بين صدا و تصوير يك پالس سلعت عمومي براي انكودر هاي صدا و تصوير بايستس استفاده شود