PDA

View Full Version : سوال: ایجاد عکس متناسب با آبجکت ها - ایجاد عکس از روی کنترل ها - خروجی عکس از جدول سودوکو



kamran_14
جمعه 16 بهمن 1394, 11:25 صبح
سلام
خسته نباشید
خروجی من در سی شارپ هنگام زدن کلید اف5 تولید میشه ولی خروجی من خیلی بزرگه یعنی از فرم من بزرگتره من میخوام اندازه اش حفظ بشه وفرم از صفحه مانیتور بزرگتر بشه یعنی اسکرول بوجود بیاد.
من میخوام از خروجی خودم عکس بگیرم ولی اندازه اش حفظ بشه ولی من فقط از خروجی که به اندازه پنجره است میتونم عکس بگیرم و فرم بیشتر از این بزرگ نمیشه
خروجی من سودوکوی سامورایی است. شما پیشنهاد میکنید چطوری از خروجی خودم بطور کامل عکس بگیرم
اگه من وایت و هایت فرم را بزرگتر از صفحه مانیتور کنم و اسکرول بوجود بیاد فکر کنم مشکل حل بشه چرا که با snagit میتونم از پنجره بطور کامل عکس بگیرم
من فایل عکس خروجی ام را گذاشتم ولی کامل نیافتاده

golbafan
جمعه 16 بهمن 1394, 12:10 عصر
روش شما مشکل داره عزیزم
شما باید سایز فرمتون حد اکثر اندازه دسکتاپ باشه

عکس میخواهید بگیرید؟ چرا؟ خودتون تصویر رو در یک bitmap ایجاد و سپس در فایل دخیره کنید

فایل ایجاد شده رو هم میتونید در PictureBox نشون بدید بصورت اتو سایز

kamran_14
جمعه 16 بهمن 1394, 15:45 عصر
شما باید سایز فرمتون حد اکثر اندازه دسکتاپ باشه

ممنون
از کمکتون
من میخوام کیفیت تصویرم خوب باشه برای همین سودوکو رو بزرگتر از صفحه نمایش کردم
من سودوکوی معمولی رو نوشتم و هر روز در روزنامه میزنم و چون سودوکوی معمولی که 9*9 هست و خانه هاش کمتر از سامورایی است، سودوکو ی معمولی رو هم تا این اندازه بزرگ کردم ولی چون خونه های کمتری داره بزرگتر از مانیتور نمیشه و مشکلی هم پیش نمیآد و من هر روز استفاده میکنم
اما سودوکوی سامورایی خونه های زیادی داره و وقتی میخوام بزرگش کنم تا بتونم اعدادرو با فونت 25 بنویسم که کیفیتش بهتر باشه (مثل سودوکوی معمولی)، سودوکو بزرگتر از مانیتور میشه
من autoScroll را برای فرم true کردم و میتونم با اسکرول کردن فرم ،عکس بگیرم اما کیفیت سودوکوی سامورایی (مثل سودوکوی معمولی که خونه هاش 9*9 بود و بزرگتر از مانیتور نبود)، نیست
شما برای گرفتن یک عکس با کیفیت چه راهی پیشنهاد میکنید؟

golbafan
جمعه 16 بهمن 1394, 19:07 عصر
عرض کردم نیازی نیست که از فرم عکس بگیرید
باید یک فایل تصویری با اندازه دلخواه تولید کنید و اونچه میخواید در اون رسم کنید و دخیره کنید.
بعدش برای کارهاتون از اون فایل تصویری استفاده کنید

رسم خط و نوشتن متن:
http://www.techotopia.com/index.php/Drawing_Graphics_in_C_Sharp

kamran_14
جمعه 16 بهمن 1394, 19:26 عصر
سلام من در سی شارپ میخوام فرم رو به همراه محتویاتش ذخیره کنم اعم از لیبل و تکست و...
آیا این امکان وجود داره؟
میشه کمک کنید>

abdullah20
جمعه 16 بهمن 1394, 19:32 عصر
منظورتون از ذخیره سازی چی هستش؟
تولید فایل اجرایی یا مانند نرم افزارهایی مثل فتوشاپ بیاید یک پروژه را ذخیره کنید؟

kamran_14
جمعه 16 بهمن 1394, 20:15 عصر
منظورتون از ذخیره سازی چی هستش؟
تولید فایل اجرایی یا مانند نرم افزارهایی مثل فتوشاپ بیاید یک پروژه را ذخیره کنید؟
ممنون
بله من میخوام فرم رو تبدیل به عکس کنه و بعد در یک فایل تصویر مثل jpg ذخیره کنه
به جای اینکه من از مانیتور عکس بگیرم با توجه به اینکه فرم من بزرگتر از مانیتور هس، میخوام خود فرم دهنگام اجرا ر یک فایل عکس ذخیره بشه

golestan1
شنبه 17 بهمن 1394, 11:43 صبح
private void button1_Click(object sender, EventArgs e)
{
try
{
// عکس گرفتن از فرم
int boundWidth = this.Width;
int boundHeight = this.Height;
int x = boundWidth - this.Width;
int y = boundHeight - this.Height;
Bitmap bt = new Bitmap(boundWidth, boundHeight);
this.DrawToBitmap(bt, this.ClientRectangle);

this.sfd.Title = "ذخيره عکس";
this.sfd.FileName = textBox1.Text.ToString();
this.sfd.Filter = "jpg files (*.jpg) |*.jpg";
if (sfd.ShowDialog() == DialogResult.OK)
bt.Save(sfd.FileName);
}
catch { }

Mahmoud.Afrad
شنبه 17 بهمن 1394, 12:55 عصر
همونطور که دوستان گفتند با توجه به آبجکتهایی که جدول رو باهاش ایجاد کردید میتونید یک عکس Bitmap ایجاد کنید. در این مورد گرفتن عکس از کنترلی که اسکرول خورده درست نیست.

فرض کنید یوزرکنترلی مانند زیر برای دریافت مقدار از کاربر ایجاد کرده ایم. یوزرکنترل دارای پراپرتی های RowIndex و ColumnIndex است که اندیس سطر و ستون باید تعیین گردد. همین اندیسها تعیین کننده محل قرارگیری یوزرکنترل هستند.
using System.Windows.Forms;

public class MyUserControl : UserControl
{
private System.Windows.Forms.TextBox txtContent;

private int _rowIndex;
private int _columnIndex;

public int RowIndex
{
get { return _rowIndex; }
set
{
_rowIndex = value;
this.Top = _rowIndex*this.Height;
}
}

public int ColumnIndex
{
get { return _columnIndex; }
set
{
_columnIndex = value;
this.Left = _columnIndex*this.Width;
}
}

public string Content
{
get { return txtContent.Text; }
}

public MyUserControl()
{
InitializeComponent();
}

/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;

/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

#region Component Designer generated code

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.txtContent = new System.Windows.Forms.TextBox();
this.SuspendLayout();
//
// textBox1
//
this.txtContent.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.txtContent.Dock = System.Windows.Forms.DockStyle.Fill;
this.txtContent.Font = new System.Drawing.Font("Microsoft Sans Serif", 14F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(178)));
this.txtContent.Location = new System.Drawing.Point(0, 0);
this.txtContent.Multiline = true;
this.txtContent.Name = "textBox1";
this.txtContent.Size = new System.Drawing.Size(34, 28);
this.txtContent.TabIndex = 0;
this.txtContent.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
this.txtContent.WordWrap = false;
//
// UserControl1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.Transparent;
this.Controls.Add(this.txtContent);
this.Name = "UserControl1";
this.Size = new System.Drawing.Size(34, 28);
this.ResumeLayout(false);
this.PerformLayout();

}

#endregion
}

فرض کنید روی فرم یک پنل(یا هر container دیگری) برای نگهداری نمونه هایی از یوزرکنترل بالا قرار داریم. حال نمونه هایی از یوزرکنترل را با کد (و یا در زمان طراحی) به پنل اضافه می کنیم.
در کد زیر دو یوزرکنترل ایجاد میکنیم:
private void CreateUserControls()
{
_userControlList = new List<MyUserControl>();
MyUserControl uc1 = new MyUserControl {RowIndex = 0, ColumnIndex = 0};
MyUserControl uc2 = new MyUserControl {RowIndex = 0, ColumnIndex = 3};
_userControlList.Add(uc1);
_userControlList.Add(uc2);

foreach (MyUserControl uc in _userControlList)
{
panelContainer.Controls.Add(uc);
}
}

از طریق کد زیر ، تعداد سطر و ستون را تعیین کرده و یک bitmap ایجاد نموده و به ازای هر یوزرکنترل یک rectangle و string درون آنرا روی bitmap ایجاد می کنیم. در نهایت عکس را return می کنیم.
private Bitmap CreateBitmap()
{
if (_userControlList == null || _userControlList.Count == 0)
return null;

Font fontOfContent = new Font(FontFamily.GenericSansSerif, 14);
Size sizeOfEachRectangle = new Size(40, 40);
int minimumRowIndex = _userControlList[0].RowIndex,
maximumRowIndex = _userControlList[0].RowIndex,
minimumColumnIndex = _userControlList[0].ColumnIndex,
maximumColumnIndex = _userControlList[0].ColumnIndex;

for (int i = 1; i < _userControlList.Count; i++)
{
if (_userControlList[i].RowIndex < minimumRowIndex)
{
minimumRowIndex = _userControlList[i].RowIndex;
}
else if (_userControlList[i].RowIndex > maximumRowIndex)
{
maximumRowIndex = _userControlList[i].RowIndex;
}

if (_userControlList[i].ColumnIndex < minimumColumnIndex)
{
minimumColumnIndex = _userControlList[i].ColumnIndex;
}
else if (_userControlList[i].ColumnIndex > maximumColumnIndex)
{
maximumColumnIndex = _userControlList[i].ColumnIndex;
}
}

int rowCount = maximumRowIndex - minimumRowIndex + 1;
int columnCount = maximumColumnIndex - minimumColumnIndex + 1;

int bmpWidth = columnCount*sizeOfEachRectangle.Width + 1;
int bmpHeight = rowCount*sizeOfEachRectangle.Height + 1;

Bitmap bmp = new Bitmap(bmpWidth, bmpHeight);
Graphics g = Graphics.FromImage(bmp);

g.Clear(Color.FromArgb(169, 215, 247));

foreach (MyUserControl userCtrl in _userControlList)
{
int x = (userCtrl.ColumnIndex - minimumColumnIndex)*sizeOfEachRectangle.Width;
int y = (userCtrl.RowIndex - minimumRowIndex)*sizeOfEachRectangle.Height;
Point recLocation = new Point(x, y);
Rectangle rect = new Rectangle(recLocation, sizeOfEachRectangle);
g.DrawRectangle(Pens.Black, rect);

StringFormat strFormat = new StringFormat
{
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
};
g.DrawString(userCtrl.Content, fontOfContent, new SolidBrush(Color.Blue), rect, strFormat);
}
return bmp;
}