تبدیل فایل Text به Image
در این مقاله چگونگی تبدیل یک فایل به فرمت Text را به فرمت Image (Jpeg، Gif و ...) یاد خواهید گرفت. این مطلب کاربردهای مختلفی دارد. آیا تا به حال در فرم عضویت بعضی سایت ها دیده اید که یک کلمه به صورت Random بر روی صفحه ظاهر می شود و شما باید آن کلمه را در یک TextBox وارد کنید؟ شاید هنوز کاربرد این تکنیک را ندانید. این تکنیک به منظور جلوگیری از ساخت Username های نامعتبر توسط برنامه های اتوماتیک انجام می شود. برنامه های اتوماتیک نمی توانند عکسی که به طور Random روی صفحه نمایش داده می شود را پردازش و تبدیل به یک رشته بکنند. در این موارد، شما می توانید یک کلمه را به صورت Random در برنامه تان ایجاد و آن را تبدیل به یک Image نمایید. البته تبدیل فایل های Text به Image کاربردهای دیگری نیز دارد. به عنوان مثالی دیگر، در بعضی موارد لازم است که خروجی یک Table یا گزارش از Database را به صورت Image ذخیره کنید.
خوب! کار را شروع کنیم...
فرض کنید که فایل Text ای به نام “MyFile.txt” داریم و می خواهیم آن را به “MyFile.jpeg” تبدیل نماییم. ابتدا باید محتویات فایل “MyFile.txt” را خوانده و در یک رشته قرار دهید. قبل از شروع، فضاهای نامی مورد استفاده را به برنامه ضمیمه کنید:
C#
using System.IO; Imports System.IO
using System.Drawing;
VB.NET
Imports System.Drawing
حال، با استفاده از کلاس StreamReader محتویات فایل Text را می خوانیم:
C#
StreamReader sr = new StreamReader("MyFile.txt");
string str = sr.ReadToEnd();
sr.Close();
VB.NET
Dim sr As New StreamReader(“MyFile.txt”)
Dim str As String
str = sr.ReadToEnd()
sr.Close()
پس از این مرحله، رشته str محتویات فایل “MyFile.txt” را در بر می گیرد. (کلیه Whitespace ها و Newline ها حفظ می شوند.)
اکنون، باید یک object از کلاس Bitmap، که برای کار با فایل های گرافیکی به کار می رود، بسازیم.
C#
Bitmap bitmap = new Bitmap(800, 600, PixelFormat.Format32bppArgb);
VB.NET
Dim bitmap As New Bitmap(800, 600, PixelFormat.Format32bppArgb);
800 طول عکس و 600 عرض آن است. آرگومان سوم، PixelFormat.Format32bppArgb نوع پیکسل های عکس ما را مشخص می کند. در این مورد، یعنی هر پیکسل 32 بیت است و از رنگ های ARGB پشتیبانی می کند.
A = Alpha یا Transparency (میزان شفافیت)
R = Red
G = Green
B = Blue
شما می توانید در صورت لزوم، ابعاد و نوع پیکسل دیگری برای عکس مورد نظرتان انتخاب کنید. PixelFormat مقادیر مختلفی برای انتخاب نوع پیکسل دارد که می توانید جزئیات بیشتر آن را در MSDN بیابید.
توجه: کلاس Bitmap را با عکس های فرمت Bitmap اشتباه نکنید! این کلاس می تواند به هر نوع عکسی، از جمله Gif، Jpeg، Bitmap، Png و ... اشاره کند.
پس از ساخت Bitmap، باید توسط متد ()Graphics.FromImage یک شیء گرافیکی برای نوشتن یا ترسیم روی Bitmap تهیه کنیم. کلاس Graphics در فضای نامی System.Drawing قرار دارد و از آن می توان برای انعکاس هر چیزی (متن، شکل گرافیکی و یا تصویر) بر روی فضایی که به آن اشاره می کند، استفاده نمود. توجه داشته باشید که نمی توانید مستقیماً از روی کلاس Graphics یک object بسازید. برای تهیه یک object از نوع Graphics، باید از یکی از متدهای Static (در #C) و یا Shared آن (در VB.NET) استفاده کنید. این متدها عبارتند از:
Graphics.FromHdc()
Graphics.FromHdcInternal()
Graphics.FromHwnd()
Graphics.FromHwndInternal()
Graphics.FromImage()
در این مثال، ما از متد آخری ()Graphics.FromImage برای تهیه یک object گرافیکی که به فایل MyFile.jpeg اشاره می کند، استفاده می کنیم. جزئیات سایر این متدها را می توانید در MSDN بخوانید.
C#
Graphics grfx = Graphics.FromImage(bitmap);
VB.NET
Dim grfx As New Graphics
Grfx = Graphics.FromImage(bitmap)
حال که یک object از نوع Graphics داریم، می توانیم روی آن نوشته، اشکال گرافیکی و یا تصاویر را ترسیم کنیم. به عنوان نمونه به متدهای زیر توجه کنید:
DrawImage()
DrawString()
DrawRectangle()
DrawPolygon()
DrawElipse()
.
.
.
FillRectangle()
FillPolygon()
FillElipse()
.
.
.
اکنون، با استفاده از متد ()DrawString رشته ای که از فایل “MyFile.txt” خواندیم را بر روی این object ترسیم می کنیم:
C#
grfx.FillRectangle(Brushes.White, 0, 0, 800, 600);
grfx.DrawString(str, new Font("Tahoma", 10), Brushes.Black, 0, 0);
VB.NET
Dim font As New Font(“Tahoma”, 10)
grfx.FillRectangle(Brushes.White, 0, 0, 800, 600)
grfx.DrawString(str, font, Brushes.Black, 0, 0)
ذکر چند نکته درباره تکه کد بالا ضروری به نظر می رسد:
1- ابتدا، با استفاده از متد FillRectangle() ، Background تصویر را با رنگ سفید رنگ می کنیم. آرگومان اول این متد، یک Brush (قلم مو) است که در اینجا ما Brushes.White را به عنوان یک قلم موی سفید ساده مشخص کرده ایم. Brushes یک کلاس است و White یک Property از نوع Static (در #C) و یا Shared (در VB.NET) است. آرگومان های بعدی این متد، به ترتیب عبارتند از x، y، width و height. با مقادیری که ما به جای این آرگومان ها قرار دادیم، کل تصویر رنگ می شود.
2- پس از اینکه Background تصویر را با رنگ سفید رنگ کردیم، متن مورد نظر را با متد ()DrawString بر روی تصویر می نویسیم. آرگومان اول این متد، رشته مورد نظر، آرگومان دوم آن، فونت مورد نظر، آرگومان سوم، قلم موی مورد نظر و 2 آرگومان آخر، x و y شروع متن را مشخص می کنند.
شما می توانید متن مورد نظر را با هر فونت، سایز و رنگی که دوست دارید بر روی تصویر منعکس کنید.
در پایان، کافی است که Bitmap ای که درست کردید را با استفاده از متد Save() بر روی دیسک ذخیره کنید:
C#
bitmap.Save("MyFile.jpeg", ImageFormat.Jpeg);
VB.NET
bitmap.Save("MyFile.jpeg", ImageFormat.Jpeg)
کل کدی که برای تبدیل یک فایل Text به Image باید بنویسید، در زیر آمده است.
C#
// Read the text file and save its content to str
StreamReader sr = new StreamReader("MyFile.txt");
string str = sr.ReadToEnd();
sr.Close();
// Create a bitmap
Bitmap bitmap = new Bitmap(800, 600, PixelFormat.Format32bppArgb);
// Get a Graphics object from the bitmap
Graphics grfx = Graphics.FromImage(bitmap);
// Write the str to the bitmap
grfx.FillRectangle(Brushes.White, 0, 0, 800, 600);
grfx.DrawString(str, new Font("Tahoma", 10), Brushes.Black, 0, 0);
// Save the bitmap to disk
bitmap.Save("MyFile.jpeg", ImageFormat.Jpeg);
VB.NET
' Read the text file and save its content to str
Dim sr As New StreamReader(“MyFile.txt”)
Dim str As String
str = sr.ReadToEnd()
sr.Close()
' Create a bitmap
Dim bitmap As New Bitmap(800, 600, PixelFormat.Format32bppArgb);
' Get a Graphics object from the bitmap
Dim grfx As New Graphics
Grfx = Graphics.FromImage(bitmap)
' Write the str to the bitmap
Dim font As New Font(“Tahoma”, 10)
grfx.FillRectangle(Brushes.White, 0, 0, 800, 600)
grfx.DrawString(str, font, Brushes.Black, 0, 0)
' Save the bitmap to disk
bitmap.Save("MyFile.jpeg", ImageFormat.Jpeg);


