ورود

View Full Version : تبدیل system.windows.forms.picturBox به [ ] byte در wpf



bivatan
جمعه 28 اردیبهشت 1397, 23:52 عصر
سلام
من یه WindowsFormsHost به نام form دارم که در واقع یه باکسه که توش تصویر اثر انگشت بعد از اسکن نشون داده میشه و Xaml اون به صورت زیره:


<WindowsFormsHost x:Name="form" Cursor="Pen" HorizontalAlignment="Left" Height="115" Margin="40,191,0,0" VerticalAlignment="Top" Width="108" MouseDown="form_MouseDown"/>

کدم هم به صورت زیر هست :


public win_add_edit_personel()
{
InitializeComponent();
pbImageFrame = new PictureBox();
form.Child = pbImageFrame;
}

یعنی یه picturebox به نام pbImageFrame از اون WindowsFormsHost درست کردم .
با این کار من یه picturebox از نوع system.windows.forms داخل wpf دارم . چون نمیتونستم image رو مستقیم به اسکنر بشناسونم مجبور شدم ازین راه استفاده کنم .

تصویر به درستی بعد از اسکن داخل form نشون داده میشه و pbImageFrame مقدار میگیره . حالا من میخوام با زدن دکمه ثبت این تصویر داخل دیتا بیس نشون داده بشه .یعنی این عکس به آرایه ای از بایت تبدیل بشه . جست و جو کردم کد زیر رو پیدا کردم :


public byte[] ImageToByteArray(System.Drawing.Image imageIn)
{
using (var ms = new MemoryStream())
{
imageIn.Save(ms, imageIn.RawFormat);
return ms.ToArray();
}
}


و به صورت زیر اونو میخوام وارد دیتا بیسم کنم :


p.personelfingerpic = ImageToByteArray(pbImageFrame);


اما خطای زیر داده میشه .
cannot convert from system.windows.forms.picturebox to system.drawing.image!
کسی میتونه کمکم کنه که بتونم این تصویر رو به آرایه ای از رشته های باینری تبدیل کنم ؟


http://uupload.ir/files/41z2_q1q_thumb.jpg (http://uupload.ir/view/41z2_q1q.jpg)



http://uupload.ir/files/funm_uyd_thumb.png (http://uupload.ir/view/funm_uyd.png)

Mahmoud.Afrad
شنبه 29 اردیبهشت 1397, 04:29 صبح
کدی که تصویر را در پیکچرباکس نمایش میدید را بزارید.

bivatan
شنبه 29 اردیبهشت 1397, 12:29 عصر
این کد مال خود sdk اثر انگشت هست :


private void DrawCapturedImages(UFScanner Scanner, PictureBox p)
{
Graphics g = pbImageFrame.CreateGraphics();
System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, pbImageFrame.Width, pbImageFrame.Height);

try
{
// 1. DrawCaptureImageBuffer
// Scanner.SaveCaptureImageBufferToBMP("C:\\image.bmp");
Scanner.DrawCaptureImageBuffer(g, rect, cbDetectCore.IsChecked.Value);
// 2. GetCaptureImageBuffer
// Bitmap bitmap;
/// int Resolution;
// Scanner.GetCaptureImageBuffer(out bitmap, out Resolution);
// pbImageFrame.Image = bitmap;
}
finally
{

}
}





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


private void btnSaveImage_Click(object sender, RoutedEventArgs e)
{

UFScanner Scanner;
UFS_STATUS ufs_res;

int nFilterIdx = 0;

if (!GetGetCurrentScanner(out Scanner))
{
return;
}

Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
dlg.Filter = "Bitmap files (*.bmp)|*.bmp|WSQ files (*.wsq)|*.wsq||";
dlg.DefaultExt = "bmp";
//bool? ss = dlg.ShowDialog();
if (dlg.ShowDialog() != true)
{
return;
}
else
{
nFilterIdx = dlg.FilterIndex;
}

if (nFilterIdx == 1)
{
ufs_res = Scanner.SaveCaptureImageBufferToBMP(dlg.FileName);
if (ufs_res == UFS_STATUS.OK)
{
tbxMessage.AppendText("UFScanner Image Buffer is saved to " + dlg.FileName + "\r\n");
}
}
else if (nFilterIdx == 2)
{
ufs_res = Scanner.SaveCaptureImageBufferToWSQ(dlg.FileName, (float)2.25);
if (ufs_res == UFS_STATUS.OK)
{
tbxMessage.AppendText("UFScanner Image Buffer is saved to " + dlg.FileName + "\r\n");
}
}


}

bivatan
شنبه 29 اردیبهشت 1397, 12:32 عصر
تو سایت https://stackoverflow.com/questions/50399969/how-to-store-imagebox-in-sql-using-c-sharp-wpf هم سوال پرسیدم ولی کسی جواب نداد یا دادند من چون زبانم خوب نیست نفهمیدم .

Mahmoud.Afrad
شنبه 29 اردیبهشت 1397, 19:54 عصر
از کنترل Image خود wpf به جای پیکچرباکس استفاده کنید. متد GetCaptureImageBuffer عکس را به صورت bitmap میده که میتونید با یک تبدیل ذر کنترل نمایش بدید. متد را به اینصورت اصلاح کنید:
private void DrawCapturedImages(UFScanner scanner, System.Windows.Controls.Image p)
{
try
{
// 1. DrawCaptureImageBuffer
// Scanner.SaveCaptureImageBufferToBMP("C:\\image.bmp ");
//Scanner.DrawCaptureImageBuffer(g, rect, cbDetectCore.IsChecked.Value);
// 2. GetCaptureImageBuffer
Bitmap bitmap;
int resolution;
scanner.GetCaptureImageBuffer(out bitmap, out resolution);
MemoryStream stream = new MemoryStream();
bitmap.Save(stream, ImageFormat.Bmp);
stream.Seek(0, SeekOrigin.Begin);
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.StreamSource = stream;
bitmapImage.EndInit();
p.Source = bitmapImage;
}
finally
{

}
}

bivatan
یک شنبه 30 اردیبهشت 1397, 15:01 عصر
دستت درد نکنه مهندس. کار کرد . خیلی خیلی تشکر.فقط من نتونستم تبدیل روانجام بدم . الان با کدشما تصویر توی source کنترل image قرار گرفت ولی هنوز همون خطای قبلی رو میده .میشه بگی چطور عکس مختویات این imagebox رو به BineryData تبدیل کنم ؟

Mahmoud.Afrad
یک شنبه 30 اردیبهشت 1397, 20:02 عصر
به اینصورت تست کنید
p.personelfingerpic =((MemoryStream)bitmapImage.StreamSource).ToArray( );
قبلش چک کنید استریم نال نباشه

bivatan
یک شنبه 30 اردیبهشت 1397, 23:42 عصر
عالی. ممنون. همونی که میخواستم نتیجه داد