1397/11/06 19:53
booysusa

 
جناب شریفی برای سوال دومم این رو نوشتم و درست شد
Sfd.Filter = "Bitmap Image (.bmp)|*.bmp|Gif Image (.gif)|*.gif |JPEG Image (.jpeg)|*.jpeg |Png Image (.png)|*.png |Tiff Image (.tiff)|*.tiff |Wmf Image (.wmf)|*.wmf";
DialogResult dr = Sfd.ShowDialog();
if (dr == DialogResult.OK)
{
Image img = pictureBox1.Image;
img.Save(Sfd.FileName);
}
1397/11/07 0:40
حاجی شریفی
مؤسس سایت
 
سلام
نقل قول نوشته شده توسط: booysusa
دیتابیس را بصورت اتچ شده میزارید کنار برنامه، خاصیت این کار چی هست...

گمانم منظورتان افزودن فایل دیتابیس به پروژه و Solution است؟!

قرار دادن فایل های اصلی برنامه به صورت دستی در مسیر bin و obj خیلی منطقی نیست.
این دو پوشه ، خروجی پروژه هستند و با حذف آنها نباید مشکلی در پروژه رخ دهد.
نباید در خروجی کار، یک فایل منبع (ورودی) را ذخیره و نگه داری کرد.
شما اگر سورس هایی از منابع معتبر دانلود کنید میبینید که فاقد این دو پوشه هستند.

پروژه شما باید طوری باشد که در هر لحظه بتوان این دو پوشه را حذف و Clean کرد و با Build بعدی محتویات ساخته شود.

همین الان در فایل zip پروژه ای که شما قرار دادید ، فقط یک sdf آن هم در مسیر bin\Debug وجود داشت،
اگر شیوه کامپایل را در Release قرار دهید چه رخ میدهد؟
برنامه بدلیل نبود sdf خطا خواهد داد.
شاید بگویید "خوب! یک کپی هم در bin\Release قرار میدهیم"
ولی اگر من جدول یا ستونی را کم و زیاد کنم ، چه میشود؟ باید یادم باشد و دستی فایل هر دو محل را بروز کنم...

اگر شیوه های(Config) های دیگری اضافه کنم چه؟
اگر پروژه را publish بگیرم چه؟
در همه این موارد باید یادم باشد و دستی فایل sdf را کپی کنم.

وجود فایلهایی مانند sdf درون پروژه کمک میکند بتوانید از طریق پنجره کمکی Properties رفتار برنامه را در زمان کامپایل با این فایلها مشخص کنید.
ضمن اینکه اگر افزونه های مناسب در VS نصب باشد با دبل کلیک فایلها میتوانید Schema کلی آنها را به راحتی مشاهده یا ویرایش کنید.

==============

همچنین از جهت دیگر dll های مورد استفاده پروژه تان هم باید داخل پوشه های برنامه باشد.
پوشه packages بسیار برای این کار مناسب و استاندارد است ولی نباید dll های مورد استفاده تان از مسیرهای خارجی باشد.
الان کتابخانه FarsiMessageBox که استفاده کرده اید از مسیر K:\ComponenntHa\FarsiMessageBoxDLL\FarsiMessageBox.dll است.
یا SqlServerCe از مسیر بسیار بدتری آمده!
این قابلیت صحیح بازشدن و کامپایل پروژه تان را در رایانه های مختلف تحت تاثیر قرار میدهد.
اگر هم الان پروژه تان در رایانه دیگر کار میکند بدلیل آن است که VS خطای فوق را مخفی میکند ، چون dll مذکور را در bin\Debug هم پیدا میکند ولی چند کلیک ساده ، خیلی راحت میتواند مشکل ساز شود!


نقل قول نوشته شده توسط: booysusa
و اینکه من چطور اینکارو کنم؟

روش های زیادی وجود دارد...
میتوانید فایل را در MyComputer با راست کلیک، کپی کنید و درون VSو با راست کلیک روی پروژه Paste کنید.
اینطوری هم فایل به محل پروژه کپی میشود و هم در csproj و Solution اضافه میشود.

نقل قول نوشته شده توسط: booysusa
برای سوال دومم این رو نوشتم و درست شد

میبخشید، دیر جواب میدهم، فقط کمی شب ها وقت خالی دارم و آن هم باید چندین کار را انجام دهم.

نقل قول نوشته شده توسط: booysusa
img.Save(Sfd.FileName)

در مورد کدتان هم، بله تقریبا درست است ولی ایراد کوچکی دارد که شاید اگر پروژه تان دانشگاهی باشد ، چندان مهم نباشد و کسی هم متوجه نشود !

مشکل آنجاست که کد جاری به پسوند و نوع تصویر رسیدگی نمیکند.
یعنی درست است که در ظاهر اجازه میدهید فایل jpg یا gif یا bmp و png توسط کاربر انتخاب شود و فایل را هم با همان نام و پسوند دلخواه کاربر ذخیره میکنید ولی در واقع هیچ توجهی به فرمت و پسوند دلخواه کاربر نمیشود.

مانند این است که یک فایل jpg را در MyComputer بروید و Rename کنید و پسوندش را gif قرار دهید.
فایل شما در ظاهر gif میشود و Viewerها هم خودکار متوجه میشوند فایل واقعا jpg است و درست نمایش اش میدهند ولی واقعا این کار شما فایل را gif نمیکند.

شبیه آن است که یک فایل docx برنامه Word را فقط با Rename بخواهید pdf کنید.
این فقط نام فایل است و ماهیت آن را تغییر نمیدهد.

اگر میخواهید واقعا فایل خروجی را به فرمت دلخواه کاربر تبدیل و ذخیره کنید باید خودتان پسوند فایل را پردازش کنید، چیزی شبیه این کد:
if (Sfd.ShowDialog() != DialogResult.OK) return; 

switch (System.IO.Path.GetExtension(Sfd.FileName)?.ToLower())
{
case ".bmp":
img.Save(Sfd.FileName, System.Drawing.Imaging.ImageFormat.Bmp ) ;
break;

case ".gif":
img.Save(Sfd.FileName, System.Drawing.Imaging.ImageFormat.Gif ) ;
break;

case ".jpg":
case ".jpeg":
img.Save(Sfd.FileName, System.Drawing.Imaging.ImageFormat.Jpeg ) ;
break;

case ".png":
img.Save(Sfd.FileName, System.Drawing.Imaging.ImageFormat.Png ) ;
break;

case ".tif":
case ".tiff":
img.Save(Sfd.FileName, System.Drawing.Imaging.ImageFormat.Tiff ) ;
break;

case ".wmf":
img.Save(Sfd.FileName, System.Drawing.Imaging.ImageFormat.Wmf ) ;
break;

default :
System.Windows.Forms.MessageBox.Show(this, "Not Supported!" ) ;
break;
}

موفق باشید و شب خوش.
1397/11/07 22:25
booysusa

 
سپاسگزارم جناب شریفی

نقل قول
همچنین از جهت دیگر dll های مورد استفاده پروژه تان هم باید داخل پوشه های برنامه باشد.
پوشه packages بسیار برای این کار مناسب و استاندارد است ولی نباید dll های مورد استفاده تان از مسیرهای خارجی باشد.
الان کتابخانه FarsiMessageBox که استفاده کرده اید از مسیر K:\ComponenntHa\FarsiMessageBoxDLL\FarsiMessageBox.dll است.


جناب شریفی گرامی من بسته کامپکت را در آنجایی که فرمودید با روش صحیح شما انجام دادم، سپاسگزارم
فقط سوالی که پیش اومده برام این هست که دیدم شما حتی فایل FarsiMessageBox.dll را هم در پوشه پکیج قرار دادید، آیا من بصورت کپی پیست ساده در پوشه پکیج کپی کنم یا روش دیگری داردف چون نتونستم فایل FarsiMessageBox.dll از قسمت Mange NuGet Pacage نصب کنم
و سوال دومم، آیا هربار که خواستم چیزی به برنامم اضافه کنم، مثلا یک کامپوننت یا چیز هایی از این قبیل، باید از این روشی که شما فرمودید استفاده کنم؟


نقل قول
میبخشید، دیر جواب میدهم، فقط کمی شب ها وقت خالی دارم و آن هم باید چندین کار را انجام دهم.

من بسیار بسیار از شما سپاسگزارم و از شما عذرخواهی میکنم، در انجمن چیزهایی فراگرفتم که هرگز در کلاس گفته نشده است هرچند تلاش استادمان برای آموختن درس ستودنیست، مدام مطالب گفته شده در پیج های مختلف انجمن را مطالعه می کنم


نقل قول
در مورد کدتان هم، بله تقریبا درست است ولی ایراد کوچکی دارد که شاید اگر پروژه تان دانشگاهی باشد ، چندان مهم نباشد و کسی هم متوجه نشود !

من مشکلم دقیقا الان این است، مثلا من عکس با فرمت jpg ذخیره کرده ام ولی هنگام خروجی گرفتن و ذخیره در دستکاپ از من سوال می کند با چه فرمتی در صورتیکه من میخواهم با همون فرمت ذخیره شده در دیتابیس، بر روی دستکاپ ذخیره کنم

و اینکه چگونه فیلتر قرار دهم که مثلا هنگام ذخیره عکس نباید حجم عکس بیش از 100 کیلوبایت باشد، یا مثلا ابعاد سایز عکس بیشتر از 300 در 400 نباشد و یا... (منظورم تیکه کدشان است )
1397/11/08 20:51
حاجی شریفی
مؤسس سایت
 
سلام
نقل قول نوشته شده توسط: booysusa
...آیا من بصورت کپی پیست ساده در پوشه پکیج کپی کنم...و سوال دومم...

در مورد این مورد در تاپیک دیگرتان پاسخ دادم.

نقل قول نوشته شده توسط: booysusa
من میخواهم با همون فرمت ذخیره شده در دیتابیس، بر روی دستکاپ ذخیره کنم

درواقع متد Save بدون ImageFormat همین کار را انجام میدهد و تصویر را با همان فرمت اولیه ذخیره میکند.
ولی باز مشکل نام ظاهری فایل و پسوند انتهای نام بوجود می آید.
یعنی شما نام file.xyz هم بدهید فایل واقعا صحیح ساخته میشود.

پس فقط نیاز به کدی دارید، که برعکس کدقبلی، پسوند فایل را از ImageFormat تصویر ،استخراج کند.
تا نام فایل با محتویات واقعی داخل آن تطبیق داشته و هردو صحیح باشد.
خلاصه کدی مانند این پسوند مناسب را پیدا میکند و دیالوگ صحیح را نشان میدهد:
if  (img?.RawFormat == null) return  ;

Guid g = img.RawFormat.Guid;
string ext;
if (g == System.Drawing.Imaging.ImageFormat.Bmp.Guid)
ext = ".bmp";
else if (g == System.Drawing.Imaging.ImageFormat.Gif.Guid)
ext = ".gif";
else if (g == System.Drawing.Imaging.ImageFormat.Jpeg.Guid)
ext = ".jpg";
else if (g == System.Drawing.Imaging.ImageFormat.Png.Guid)
ext = ".png";
else if (g == System.Drawing.Imaging.ImageFormat.Tiff.Guid)
ext = ".tif";
else if (g == System.Drawing.Imaging.ImageFormat.Wmf.Guid)
ext = ".wmf";
else
return ;

Sfd.Filter = $"{ext.ToUpper()} Image|*{ext}";
if (Sfd.ShowDialog() != DialogResult.OK) return ;
img.Save(Sfd.FileName) ;


نقل قول نوشته شده توسط: booysusa
و اینکه چگونه فیلتر قرار دهم که مثلا هنگام ذخیره عکس نباید حجم عکس بیش از 100 کیلوبایت باشد...یا مثلا ابعاد سایز عکس بیشتر از 300 در 400 نباشد

if  (Ofd.ShowDialog() != DialogResult.OK) return ;

var fi = new System.IO.FileInfo(Ofd.FileName) ;
if (!fi.Exists)
{
System.Windows.Forms.MessageBox.Show("File not found!" ) ;
return ;
}

if (100 > fi.Length || fi.Length > 100 * 1024)
{
System.Windows.Forms.MessageBox.Show("Invalid file length!" ) ;
return ;
}

var img = System.Drawing.Image.FromFile(Ofd.FileName) ;
if (300 > img.Width || img.Width > 400 || 300 > img.Height || img.Height > 400)
{
img.Dispose();
System.Windows.Forms.MessageBox.Show("Invalid file size!" ) ;
return ;
}

this .pictureBox1.Image = img;


موفق باشید.
1397/11/13 21:42
booysusa

 
سپاسگزارم جناب شریفی
عالی، دقیقا همین را خواستم
من خیلی به شما مدیون هستم