PDA

View Full Version : تغيير اندازه دادن عكس در picture box



csharpprogramer88
یک شنبه 19 اردیبهشت 1389, 23:45 عصر
سلام
من تونستم با جستجو در اين سايت يك تصوير را در ديتابيس ذخيره كنم اينم كدش :


OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Image Files|*.jpg";
DialogResult dr = ofd.ShowDialog();
if (dr != DialogResult.OK)
return;
Bitmap image = new Bitmap(ofd.FileName);
MemoryStream stream = new MemoryStream();
image.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
imageDat = stream.ToArray();
SqlCommand command = new SqlCommand();
string co = "insert into pic(id,pic)values('1',@pic)";
command.CommandText = co;
command.Connection = con;
command.Parameters.AddWithValue("@pic", imageDat);
con.Open();
command.ExecuteNonQuery();
con.Close();




ولي با تصاوير كيفيت بالا مشكل داره يعني زمانيكه مي خوام در پيكچرباكس نشانش بدم قسمت زيادي از تصوير نشان داده نمي شه خواستم تصاوير را كوچيك كنم با جستجو توي همين سايت نتونستم مشكل خودم را حل كنم دوستان چطوري بايد تصوير را كوچك تر كنم آيا كيفيت تصوير افت مي كنه .
با تشكر

ali.aghdam
دوشنبه 20 اردیبهشت 1389, 00:07 صبح
می بایست اندازه نصاویر را کوچک کنید
بنده قبلا رو این مورد کار کرده ام ،می تونید از تابع زیر استفاده کنید:


// resize image
public Image resizeImage(Image imgToResize, Size size)
{
int sourceWidth = imgToResize.Width;
int sourceHeight = imgToResize.Height;

float nPercent = 0;
float nPercentW = 0;
float nPercentH = 0;

nPercentW = ((float)size.Width / (float)sourceWidth);
nPercentH = ((float)size.Height / (float)sourceHeight);

if (nPercentH < nPercentW)
nPercent = nPercentH;
else
nPercent = nPercentW;

int destWidth = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);

Bitmap b = new Bitmap(destWidth, destHeight);
Graphics g = Graphics.FromImage((Image)b);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQua lityBicubic;

g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
g.Dispose();

return (Image)b;
}

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

csharpprogramer88
دوشنبه 20 اردیبهشت 1389, 07:31 صبح
می بایست اندازه نصاویر را کوچک کنید
بنده قبلا رو این مورد کار کرده ام ،می تونید از تابع زیر استفاده کنید:


// resize image
public Image resizeImage(Image imgToResize, Size size)
{
int sourceWidth = imgToResize.Width;
int sourceHeight = imgToResize.Height;

float nPercent = 0;
float nPercentW = 0;
float nPercentH = 0;

nPercentW = ((float)size.Width / (float)sourceWidth);
nPercentH = ((float)size.Height / (float)sourceHeight);

if (nPercentH < nPercentW)
nPercent = nPercentH;
else
nPercent = nPercentW;

int destWidth = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);

Bitmap b = new Bitmap(destWidth, destHeight);
Graphics g = Graphics.FromImage((Image)b);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQua lityBicubic;

g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
g.Dispose();

return (Image)b;
}

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

اين كد را چطوري بايد استفاده كنم

ali.aghdam
دوشنبه 20 اردیبهشت 1389, 17:12 عصر
خیلی ساده است پارامتر ورودی اول یک Image می گیرد و دومی Size مثلا به صورت زیر :


resizeImage(pictureBox1.Image, new Size(180, 120))

و اون رو در یک متغیر از نوع Image ذخیره کن یا در Bitmap به صورت زیر :


Bitmap bitmap = new Bitmap(180, 120);
bitmap = (Bitmap)resizeImage(pictureBox1.Image, new Size(180, 120));

csharpprogramer88
دوشنبه 20 اردیبهشت 1389, 18:41 عصر
خیلی ساده است پارامتر ورودی اول یک Image می گیرد و دومی Size مثلا به صورت زیر :


resizeImage(pictureBox1.Image, new Size(180, 120))

و اون رو در یک متغیر از نوع Image ذخیره کن یا در Bitmap به صورت زیر :


Bitmap bitmap = new Bitmap(180, 120);
bitmap = (Bitmap)resizeImage(pictureBox1.Image, new Size(180, 120));

دوست من لطف كردي به سوال من جواب دادي
همونطوري كه در پست يك گفتم با اون كد تونستم يك تصوير را ذخيره كنم . حالا با كد زير اومدم و اون تصويراز بانك را فراخواني كردم


private void button2_Click(object sender, EventArgs e)
{
// byte[] dss = stream.ToArray();

SqlConnection s = new SqlConnection("Data Source=.\\sqlexpress;Initial Catalog=taghvim2;Integrated Security=True;Pooling=False");
SqlCommand sc = new SqlCommand("select * from pic where id='1'", s);
s.Open();
DataTable dt = new DataTable();
SqlDataAdapter d = new SqlDataAdapter(sc);
d.Fill(dt);
SqlDataReader dr = sc.ExecuteReader();
//dataGridView1.DataSource = dt;
int i = 0;
while (dr.Read())
{
i++;
this.pictureBox1.Refresh();
byte[] dss = (byte[])dr["pic"];//drv["im"];
MemoryStream stream = new MemoryStream(dss);
Bitmap image = new Bitmap(stream);
pictureBox1.Image = image;
System.Threading.Thread.Sleep(1000);

resizeImage(pictureBox1.Image, new Size(180, 120));
Bitmap bitmap1 = new Bitmap(180, 120);
bitmap1 = (Bitmap)resizeImage(pictureBox1.Image, new Size(180, 120));
}

}


تابعي كه شما معرفي كرديد را در بالا نوشتم و بصورتي كه با خط قرمز نوشتم بكارگيري كردم ولي نميدونم چرا تصوير با سايز خودش مياد لطفا يك بررسي بكنيد دوست عزيز من از درج تصوير و اينها چيزي نميدونم و اينقدري هم كه نوشتم با جستجو در سايت بدست آوردم خواهشا ساده تر توضيح بديد تا متوجه بشم .

cardano7
دوشنبه 20 اردیبهشت 1389, 23:16 عصر
سلام
من برای این کار از متد GetThumbnailImage استفاده می کنم.

http://msdn.microsoft.com/en-us/library/system.drawing.image.getthumbnailimage.aspx

csharpprogramer88
دوشنبه 20 اردیبهشت 1389, 23:38 عصر
سلام
من برای این کار از متد GetThumbnailImage استفاده می کنم.

http://msdn.microsoft.com/en-us/library/system.drawing.image.getthumbnailimage.aspx

دوست عزيز من تازه كارم و از آدرسي كه فرستادي نتونسم استفاده كنم اگر امكان داره كمك كنين

soheil_1367
دوشنبه 20 اردیبهشت 1389, 23:58 عصر
این کد چی به دردت نمی خوره ؟؟

pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
عکس رو اندازه picturebox می کنه .

cardano7
سه شنبه 21 اردیبهشت 1389, 14:52 عصر
دوست عزيز من تازه كارم و از آدرسي كه فرستادي نتونسم استفاده كنم اگر امكان داره كمك كنين


سلام
من از این روش برای scale کردن عکس استفاده می کنم. و این روش به جز زمانی که Transparency داشته باشیم خوب کار می کنه:

static public Image Scale(Image image, double scale)
{
return image.GetThumbnailImage((int)(image.Width * scale), (int)(image.Height * scale), null, System.IntPtr.Zero);
}

csharpprogramer88
چهارشنبه 22 اردیبهشت 1389, 16:45 عصر
سلام و تشكر از همه دوستاني كه جواب دادن بالاخره با كمك دوستان موفق شدم درستش كنم و ميگذارمش اينجا تا دوستان استفاده كنن




SqlConnection s = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\taghvim2.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
SqlCommand sc = new SqlCommand("select * from pic where id='1'", s);
s.Open();
DataTable dt = new DataTable();
SqlDataAdapter d = new SqlDataAdapter(sc);
d.Fill(dt);
SqlDataReader dr = sc.ExecuteReader();
//dataGridView1.DataSource = dt;
int i = 0;
while (dr.Read())
{
i++;
this.pictureBox1.Refresh();
byte[] dss = (byte[])dr["pic"];//drv["im"];
MemoryStream stream = new MemoryStream(dss);
Bitmap image = new Bitmap(stream);
pictureBox1.Image = image;
System.Threading.Thread.Sleep(1000);
}
this.pictureBox1.Refresh();
resizeImage(pictureBox1.Image, new Size(180, 120));
Bitmap bitmap = new Bitmap(180, 120);
bitmap = (Bitmap)resizeImage(pictureBox1.Image, new Size(180, 120));
pictureBox1.Image = bitmap;

تابع مورد استفاده همان تابع پست 2 مي باشد

csharpprogramer88
چهارشنبه 22 اردیبهشت 1389, 16:47 عصر
سلام و تشكر از همه دوستاني كه جواب دادن بالاخره با كمك دوستان موفق شدم درستش كنم و ميگذارمش اينجا تا دوستان استفاده كنن




SqlConnection s = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\taghvim2.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
SqlCommand sc = new SqlCommand("select * from pic where id='1'", s);
s.Open();
DataTable dt = new DataTable();
SqlDataAdapter d = new SqlDataAdapter(sc);
d.Fill(dt);
SqlDataReader dr = sc.ExecuteReader();
//dataGridView1.DataSource = dt;
int i = 0;
while (dr.Read())
{
i++;
this.pictureBox1.Refresh();
byte[] dss = (byte[])dr["pic"];//drv["im"];
MemoryStream stream = new MemoryStream(dss);
Bitmap image = new Bitmap(stream);
pictureBox1.Image = image;
System.Threading.Thread.Sleep(1000);
}
this.pictureBox1.Refresh();
resizeImage(pictureBox1.Image, new Size(180, 120));
Bitmap bitmap = new Bitmap(180, 120);
bitmap = (Bitmap)resizeImage(pictureBox1.Image, new Size(180, 120));
pictureBox1.Image = bitmap;

تابع مورد استفاده همان تابع پست 2 مي باشد