PDA

View Full Version : سوال: مشکل در ذخیره عکس اسکن شده درون دیتابیس



tara1367
یک شنبه 23 شهریور 1393, 13:16 عصر
سلام دوستان
من در برنامم با 2 روش عکس رو درون دیتابیس ذخیره می کنم. 1 - ضمیمه کردن عکس (انتخاب عکس از هارد با پنجره OpenFileDialog )
2 - اسکن عکس
با روش 1 که هیچ مشکلی ندارم ، عکس از پنجره OpenFileDialog انتخاب شده ، در pictureBox نمایش داده میشه و در نهایت در دیتابیس ذخیره میشه.
اما در روش 2 بعد از اسکن شدن که عکس درون pictureBox قرار میگیره در هنگام ذخیره این ارور رو میده:
Value cannot be null. Parameter name : encoder
که داره از خطی که میخواد عکس درون pictureBox رو بخونه ایراد می گیره. در صورتی که pictureBox خالی نیست!

کد مربوط به خواندن عکس اسکن شده در pictureBox :


private void VSTwain1_ImageAcquired(object sender, EventArgs e)
{
if (pictureBox1.Image != null)
{
pictureBox1.Image.Dispose();
pictureBox1.Image = null;
}
pictureBox1.Image = VSTwain1.GetCurrentImage();
}


private void buttonX1_Click(object sender, EventArgs e)
{
try
{


if (!VSTwain1.IsTwainAvailable)
{
if (VSTwain1.IsTwain2Compatible)
{
if (MessageBox.Show("TWAIN 2.0 Data Source Manager (TWAINDSM.DLL) is not found!" +
Environment.NewLine +
Environment.NewLine +
"Do you want to use TWAIN 1.x Data Source Manager (TWAIN_32.DLL) ?",
"Start Device",
MessageBoxButtons.YesNo) == DialogResult.Yes)
{
chkTwain2Compatible.Checked = false;
VSTwain1.IsTwain2Compatible = false;
}
else
return;
}
}


VSTwain1.StartDevice();
VSTwain1.ShowUI = chkShowUI.Checked;
VSTwain1.ModalUI = chkModalUI.Checked;
VSTwain1.ShowIndicators = chkShowIndicators.Checked;
VSTwain1.DisableAfterAcquire = chkDisableAfterAcq.Checked;
VSTwain1.AutoCleanBuffer = chkAutoCleanBuffer.Checked;


if (chkShowSelector.Checked)
{
if (VSTwain1.SelectSource())
VSTwain1.Acquire();
}
else
VSTwain1.Acquire();


}
catch (Vintasoft.Twain.TwainException ex)
{
MessageBox.Show(ex.Message);
}
}







کد مربوط به ذخیره عکس درون pictureBox در دیتابیس:




private void btnsave_Click(object sender, EventArgs e)
{
try
{
MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
byte[] arrPic = ms.GetBuffer();
ms.Close();


string strPName = "";
if (rbtnScan.Checked == true)
strPName = textBoxX1.Text;
if (rbtnZamime.Checked == true)
strPName = txtZPicName.Text;


SqlCommand cmd = new SqlCommand("INSERT INTO TScan (UserId,PName,Company,PGroup,PDate," +
"PicName,Pic,Des) VALUES('" + txtId.Text + "','" + txtFname.Text + ' ' + txtLname.Text +
"','" + cmbCompanyName.Text + "','" + cmbGroup.Text + "','" +
codes.MergeTexboxesForDate(txtday, txtmonth, txtyear) + "',@PicName,@Pic,'" + txtDes.Text + "')",
conn = new SqlConnection(codes.ReturnConnectionstring()));
//cmd.Parameters.Add("@FCode", SqlDbType.Int).Value = sttCode;
cmd.Parameters.Add("@PicName", SqlDbType.NVarChar, 400).Value = strPName;
cmd.Parameters.Add("@Pic", SqlDbType.VarBinary).Value = arrPic;


conn.Open();
cmd.ExecuteNonQuery();
MessageBox.Show("ضمیمه ثبت گردید");
ShowData();
conn.Close();
}
catch (SystemException ex)
{
MessageBox.Show(ex.Message);
}


}


کد مربوط به خواندن عکس از روی هارد :



OpenFileDialog dlgOpen = new OpenFileDialog();
dlgOpen.Filter =
"Image Files(*.BMP;*.JPG;*.GIF;*.JPEG)|*.BMP;*.JPG;*.GIF; *.JPEG";
dlgOpen.Title = "انتخاب تصوير";
if (dlgOpen.ShowDialog() == DialogResult.OK)
{
pictureBox1.Image = Image.FromFile(dlgOpen.FileName);
string FilePath = dlgOpen.FileName;

strFileName = Path.GetFileName(FilePath);
txtZPicName.Text = strFileName;
}


من فقط در ذخیره عکس اسکن شده که در pictureBox هست مشکل دارم. ممنون میشم اگر کسی میدونه راهنمایی کنه.
با سپاس

hashem.heidari
یک شنبه 23 شهریور 1393, 13:43 عصر
سلام.
شما می تونید ستون picture درون دیتابیس رو از نوع varbinary(MAX) در نظر بگیرید و عکستون رو به بایت تبدیل کرده و آن رو درون دیتابیس ذخیره کنید.
اگر نیاز داشتین تا کدش رو براتون بزارم.

hashem.heidari
یک شنبه 23 شهریور 1393, 14:51 عصر
SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=test;Persist Security Info=True;User ID=sa;Password=11235");



OpenFileDialog dlgOpen = new OpenFileDialog();

dlgOpen.Filter =
"Image Files(*.BMP;*.JPG;*.GIF;*.JPEG)|*.BMP;*.JPG;*.GIF; *.JPEG";

dlgOpen.Title =
"انتخاب تصوير";


if (dlgOpen.ShowDialog() == DialogResult.OK)

{

pictureBox1.Image =
Image.FromFile(dlgOpen.FileName);

}



try

{


MemoryStream ms = new MemoryStream();

pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);


byte[] arrPic = ms.GetBuffer();

ms.Close();




SqlCommand cmd = new SqlCommand("INSERT INTO PictureTable (Pic) VALUES(@Pic)");

cmd.Parameters.Add(
"@Pic", SqlDbType.VarBinary).Value = arrPic;



//********* // ********

cmd.Connection = conn;


//********* // ********


conn.Open();

cmd.ExecuteNonQuery();

conn.Close();


MessageBox.Show("ضمیمه ثبت گردید");

}


catch

{


// exceptions

}

tara1367
دوشنبه 24 شهریور 1393, 08:43 صبح
سلام.
شما می تونید ستون picture درون دیتابیس رو از نوع varbinary(MAX) در نظر بگیرید و عکستون رو به بایت تبدیل کرده و آن رو درون دیتابیس ذخیره کنید.
اگر نیاز داشتین تا کدش رو براتون بزارم.


تشکر ولی منم برای ذخیره همین کار رو کردم ولی اروری که داره میده یعنی pictureBox خالیه. در صورتی که پر هست و داره عکس اسکن شده رو نشون میده. در واقع همونطور که قبلا گفتم عکسی رو که از طریق پنجره openDialog از روی هارد در pictureBox میریزم رو راحت در دیتابیس ذخیره میکنه. ولی عکسی رو که از طریق اسکن در pictureBox میریزم رو ذخیره نمی کنه و پیفام میده که خالیه!!
در ضمن من کدهایی رو که زحمت کشیدین گذاشتین رو نمی تونم ببینم.
با سپاس

hashem.heidari
دوشنبه 24 شهریور 1393, 10:25 صبح
سلام.
شما این خط رو ننوشته بودید. قبل از خط conn.Open
این رو بنویسید
cmd.Connection = conn;

tara1367
سه شنبه 25 شهریور 1393, 10:42 صبح
تشکر ولی همونطور که گفتم با دستور ذخیره در دیتابیس مشکلی ندارم چون عکس خوانده شده از هارد رو میتونم ذخیره کنم. در ضمن کانکشن رو برای cmd داخل همون پرانتز تعریف کردم. مشکل اینه که وقتی اسکن میکنم و تصویر در picture box قرار میگیره بعد موقع خواندن مجدد این عکس از picture box پیغام میده که خالیهدر صورتی که من دارم عکس اسکن شده رو درون picture box می بینم.