PDA

View Full Version : ذخیره بک گراند فرم در تنظیمات برنامه



xxnagin
شنبه 18 بهمن 1393, 21:43 عصر
سلام
من دو تا عکس دارم که برای پلیر هستش یه عکس mini و عکس اصلی main
که در Resources هستش میخوام بعد از بستن برنامه عکسی که به عنوان بک گراند هست را ذخیره کنم
یعنی هروقت فرم mini بود عکس mini و هر وقت main بود main ذخیره بشه
تا اینجا میدونم که موقع لود و بستن فرم عکس باید تبدیل به string بشه
و داخل تنظیمات برنامه (Settings) ذخیره و بازیابی میشه توسط دو تابع زیر
GetStringFromImage
GetImageFromString
یه دکمه برای رفتن به mini که روی فرم main
chekform(true)
یه دکمه برای رفتن به main که روی فرم mini
chekform(false)
قرار دارند
موقع لود
string imageform = Properties.Settings.Default.imageform

chekform(Properties.Settings.Default.chekminiform) که روی هر کدام بود اون عکس ذخیره میشه
اینم بگم فقط روی یه فرم هستش



public static string GetStringFromImage(Image image)
{
if (image != null) {
ImageConverter ic = new ImageConverter();
byte[] buffer = (byte[])ic.ConvertTo(image, typeof(byte[]));
return Convert.ToBase64String(buffer, Base64FormattingOptions.InsertLineBreaks);
} else {
return null;
}
}
public static Image GetImageFromString(string base64String)
{
if (string.IsNullOrWhiteSpace(base64String))
return null;
byte[] buffer = Convert.FromBase64String(base64String);
if (buffer != null) {
ImageConverter ic = new ImageConverter();
return ic.ConvertFrom(buffer) as Image;
} else {
return null;
}
}
private void chekform(bool chek)
{
if (chek) {
Background = My.Resources.mini;
minichek = chek;
} else if (chek == false) {
Background = My.Resources.main;
minichek = chek;
} else if (Background == null) {
minichek = false;
imageform = GetStringFromImage(My.Resources.main);
Background = GetImageFromString(imageform);
}
this.BackgroundImage = Background;
this.BackgroundImageLayout = ImageLayout.None;
this.Region = MakeRegion(Background);
this.Size = new Size(Background.Width, Background.Height);
}
private System.Drawing.Region MakeRegion(Bitmap skinBmp)
{
if (skinBmp == null)
return null;
Region fullRegion = null;
Region lineRegion = new Region();
Color transparentColor;
bool inLine = false;
int startLineX = 0;
transparentColor = skinBmp.GetPixel(0, 0);
for (int y = 0; y <= skinBmp.Height - 1; y++)
{
for (int x = 0; x <= skinBmp.Width - 1; x++)
{
if (skinBmp.GetPixel(x, y).ToArgb == transparentColor.ToArgb)
{
if (inLine)
{
inLine = false;
lineRegion = new Region(new Rectangle(startLineX, y, x - startLineX, 1));
if (fullRegion == null)
{
fullRegion = lineRegion;
}
else
{
fullRegion.Union(lineRegion);
}
}
}
else
{
if (!inLine)
{
inLine = true;
startLineX = x;
}
}
}
}
return fullRegion;
}

Saman_12
شنبه 18 بهمن 1393, 22:51 عصر
متوجه نشدم سوال هست یا آموزش...
اگر سواله مشکل کجاست؟ توی ذخیره و نگه داری؟ : شما جای ذخیره کردن Base64String عکس بیا فقط اسم عکس رو ذخیره کنید موقع لود هم با همون اسم عکس لود کنید :

My.Resources.ResourceManager.GetObject("min-or-max")

xxnagin
یک شنبه 19 بهمن 1393, 13:25 عصر
سواله
روش دیگه هم وجود داره یا نه ؟
من اینو نگفتم ببخشید
موقع طراحی در اصل عکسی وجود نداره یعنی
یعنی قبل از لود اگر عکسی وجود نداشت خودش خودکار عکس پیشفرض را main باشه
و مقدار chekform (Properties.Settings.Default.chekminiform) که false پیشفرض هستش main بکگراند بشه
حالا مشکل اینجاست که چون Properties.Settings.Default.chekminiform =false هستش نرمال باید فرم لود بشه
و خطا میگیره
از این کد هم استفاده کردم
if this.BackgroundImage =null
} chekform=false;
this.BackgroundImage =Properties.Resources.main

{