PDA

View Full Version : مشکل با OpenFileDialog



ho_612
پنج شنبه 08 مهر 1389, 12:10 عصر
من یه مشکلی دارم با OpenFileDialog . یه برنامه ای نوشتم که یک فایل عکس رو انتخاب میکنه و در جایی ذخیره میکنه. مشکلی تو این مورد نیست. اما وقتی که میخوام یکی از عکس ها رو عوض کنم (البته بعد از نمایش عکس در PictureBox ) و اون رو به نام فایل قبلی ذخیره کنم سیستم ایراد میگیره که این فایل در حال حاضر توسط برنامه دیگه ای استفاده میشه و نمی تونم اون رو تغییر بدهم.
مثلا اگر عکس علی رو که به با نام علی ذخیره شده رو اشتباهی ذخیره کرده باشم و بخوام یه عکس دیگه ای رو با نام علی جایگزین عکس قبلی بکنم سیستم ایراد بالا رو میگیره.
چطوری میشه این مشکل رو برطرف کرد؟؟

alimanam
پنج شنبه 08 مهر 1389, 12:49 عصر
با سلام

با این روش دیگه مشکلی پیش نمیاد . موفق باشید .

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim ofd As New OpenFileDialog
ofd.Filter = "All Supprt|*.jpg;*.bmp;*.png;*.gif"
If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
PictureBox1.ImageLocation = ofd.FileName
End If
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim sfd As New SaveFileDialog
sfd.Filter = "Bitmap|*.bmp|Jpeg|*.jpg|Gif|*.gif|PNG|*.png"
If sfd.ShowDialog = Windows.Forms.DialogResult.OK Then
Select Case sfd.FilterIndex
Case Is = 1
PictureBox1.Image.Save(sfd.FileName, Imaging.ImageFormat.Bmp)
Case Is = 2
PictureBox1.Image.Save(sfd.FileName, Imaging.ImageFormat.Jpeg)
Case Is = 3
PictureBox1.Image.Save(sfd.FileName, Imaging.ImageFormat.Gif)
Case Is = 4
PictureBox1.Image.Save(sfd.FileName, Imaging.ImageFormat.Png)
End Select
End If

یا اگه می خوای پنجره ذخیره سازی هم دیده نشه اینجوری میشه تغییرش داد .

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim ofd As New OpenFileDialog
ofd.Filter = "All Supprt|*.jpg;*.bmp;*.png;*.gif"
If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
PictureBox1.ImageLocation = ofd.FileName
Dim bm As New Bitmap(ofd.FileName, True)
bm.Save("imagename.bmp", System.Drawing.Imaging.ImageFormat.Bmp)
End If
End Sub

ho_612
جمعه 09 مهر 1389, 17:26 عصر
از جوابتون ممنونم.
اما فکر کنم سوالم رو درست مطرح نکردم.چون جواب شما کاملا برعکس منظور من بود.
سوال رو دوباره مطرح میکنم:
عکس مورد نظر من در حال حاظر در یک PictureBox و با نامی مشخص در حال نمایش هست. چگونه من میتونم عکس دیگری رو به جای این عکس در همان آدرس قبلی و با همان نام قبلی (به جای عکس قبلی) ذخیره کنم؟؟
با دستور زیر اینکار رو انجام دادم ولی سیستم میگه که عکس مورد نظر توسط برنامه ای درحال استفاده هست در نتیجه نمیشه عکسی رو جایگزینش کرد!

جهت انتخاب عکس :



Private Sub select_pic()
Try
If ofd.ShowDialog = Windows.Forms.DialogResult.Cancel Then
Exit Sub
Else
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
PictureBox1.Image = Image.FromFile(ofd.FileName)



End Sub
جهت ذخیره عس درحال نمایش و جایگزینی :



Private Sub save_select()
If ofd.FileName <> "" Then
Dim save As String
save = "data\pic\" & id & ".jpg"
IO.File.Copy(ofd.FileName, save, overwrite:=True)
Else
MsgBox("")
End If
ofd.FileName = ""
End Sub

xminxmin
جمعه 09 مهر 1389, 18:07 عصر
شما قبل از هر كاري بايد picturebox رو خالي كنيد و ارتباطات اون رو از بين ببريد. بعد اقدام به دخيره فايل كنيد.

ho_612
جمعه 09 مهر 1389, 22:58 عصر
فکر نکنم از PictureBox باشه . چون PictureBox دیگه از اون عکس قبلی که استفاده نمیکنه. عکس جدید رو داره نمایش میده!حالا چطوری میشه یکبار خالیش کرد یا ریست کرد و دوباره لود ش کرد؟ دستوری برای این کار ندیدم؟

Rezahak
شنبه 10 مهر 1389, 08:51 صبح
با سلام
احتمالا مشكل شما از جاي ديگري ناشي مي شود . يك نگاه به كد بنداز ببين همه جاهايي كه با file يا filestream كار كردي در پايان كار آنرا close كردي؟

ho_612
یک شنبه 11 مهر 1389, 18:43 عصر
برنامه رو برای تست میزارم اینجا . دوستان یه نگاهی به اون بندازنین ببینین مشکل کجاست.
خیلی خیلی ممنون میشم.

dorche
یک شنبه 11 مهر 1389, 19:04 عصر
به دنبال Indexed image بگرد من کد سی شارپشو میزارم

[System.Runtime.InteropServices.DllImport("Kernel32.dll", EntryPoint = "CopyMemory")]
private extern static void CopyMemory(IntPtr dest, IntPtr src, uint length);

public static Image CreateIndexedImage(string path)
{
using (var sourceImage = (Bitmap)Image.FromFile(path))
{
var targetImage = new Bitmap(sourceImage.Width, sourceImage.Height,
sourceImage.PixelFormat);
var sourceData = sourceImage.LockBits(
new Rectangle(0, 0, sourceImage.Width, sourceImage.Height),
ImageLockMode.ReadOnly, sourceImage.PixelFormat);
var targetData = targetImage.LockBits(
new Rectangle(0, 0, sourceImage.Width, sourceImage.Height),
ImageLockMode.WriteOnly, targetImage.PixelFormat);
CopyMemory(targetData.Scan0, sourceData.Scan0,
(uint)sourceData.Stride * (uint)sourceData.Height);
sourceImage.UnlockBits(sourceData);
targetImage.UnlockBits(targetData);
return targetImage;
}
}

ho_612
دوشنبه 12 مهر 1389, 23:59 عصر
منظور شما رو متوجه نشدوم(چیزی پیدا نکردم) . کد رو هم به vb تبدیل کردم و ایراد گرفت.
دوستان کسی میتونه کمک کنه؟؟

ho_612
چهارشنبه 14 مهر 1389, 20:01 عصر
از دوستان کسی برنامه رو دانلود نکرده؟؟؟:ناراحت:
کسی ، راه حلی ، پیشنهادی ......

ho_612
شنبه 17 مهر 1389, 23:09 عصر
از اساتید گرام تا به حال کسی همچین برنامه ای ننوشته!!!!!
حتی یک نفر هم برنامه دانلود نکرده ببینه مشکل کجاست؟!

alimanam
پنج شنبه 22 مهر 1389, 21:01 عصر
با سلام


از اساتید گرام تا به حال کسی همچین برنامه ای ننوشته!!!!!
حتی یک نفر هم برنامه دانلود نکرده ببینه مشکل کجاست؟!

دوست عزیز وقتی تاپیکتون میره پایین دیگه کسی نمیبینه که جواب بده ( اکثر دوستان لطفشون به 20 تاپیک اول میرسه :متفکر: ) سورس شما که خیلی ضعیف بود !!! چرا لغمه رو هی دور سرت می چرخونی ؟؟؟

اول اینکه فایل 1 و 2 ( عکس 1 و 2 ) خاصیت ReadOnly اونها فعال بود ( البته ربطی به اون نداشت فقط جهت اطلاع ذکر کردم ) دوماً که وقتی یه عکس رو به یه کنترل PictureBox پاس میدی خوب اون فایل تا هنگامی که برنامه بازه قفل میشه و برنامه اجازه هیچگونه دستکاری در مورد اون فایل تصویر رو به شما نمیده . :چشمک: خوب حالا راه چاره چیه ؟؟؟ راه چاره اینه که تصویر رو به صورت مستقیم نیای به شی کنترل پیکچرباکس بفرستی تا نمایشش بده . من کدهای شما رو اینجوری تغییر دادم تا مشکلتون حل بشه . موفق باشید .

Public Class Form1
Private ofd As New OpenFileDialog
Private m_Bitmap As Bitmap
Private Sub LoadImage(ByVal file_name As String)
If Not (m_Bitmap Is Nothing) Then m_Bitmap.Dispose()
Dim bm As New Bitmap(file_name)
m_Bitmap = New Bitmap(bm.Width, bm.Height)
Dim gr As Graphics = Graphics.FromImage(m_Bitmap)
gr.DrawImage(bm, 0, 0)
bm.Dispose()
PictureBox1.Image = m_Bitmap
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
LoadImage("data\pic\" & TextBox1.Text)
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
LoadImage(ofd.FileName)
End If
End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
PictureBox1.Image.Save("data\pic\" & TextBox1.Text, Imaging.ImageFormat.Jpeg)
MsgBox("image saved", MsgBoxStyle.Information)
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ofd.Filter = "Jepg|*.jpg"
End Sub
End Class

ho_612
دوشنبه 10 آبان 1389, 23:10 عصر
آقای alimanam از اینکه وقت گذاشتین و جواب دادین خیلی ممنونم.
ولی باز هم همون مشکل قبلی تکرار شد.با همون کد هایی که شما نوشتید:افسرده:
فکر کنم باید برم سراغ درج عکس داخل دیتا بیس.چون در اون حالت همچین مشکلی پیش نمیاد.

mahdi1373
دوشنبه 10 آبان 1389, 23:39 عصر
سلام عزیز، اینجوری عوضش کن:


Private Sub save_select()
If ofd.FileName <> "" Then
Dim save As String
save = "data\pic\" & id & ".jpg"
PictureBox1.Image.Dispose()
IO.File.Copy(ofd.FileName, save, overwrite:=True)
Else
MsgBox("")
End If
ofd.FileName = ""
End Sub

ho_612
یک شنبه 16 آبان 1389, 23:19 عصر
آقا مهدی دستت درد نکنه:تشویق:.دیگه داشتم نا امید میشدم.درست شد:لبخندساده:
یه توضیحی میدید در رابطه با چند خط بالا.منظورم اینکه مشکل کجا بود؟؟لطفا. با تشکر مجدد:لبخندساده:

ho_612
یک شنبه 16 آبان 1389, 23:40 عصر
من این رو تست کردم.کار میکنه ولی....
فقط یکبار این دستور عمل میکنه!! یعنی برای بار دوم که دوباره یه عکسی رو نتخاب میکنی و بعد میخواهی جابه جا کنی قبول نمیکنه و دوباره همون مشکل قبلی رو داره:اشتباه:

nosrati1363
سه شنبه 18 آبان 1389, 10:26 صبح
:عصبانی++::عصبانی++: سلام
از همه دوستان عذر می خوام
20 دفعه یک مدل کد نوشتين . ho_612 عزیز همون متد Dispose درسته باید اما برای تمام منابعی که استفاده شده اند از اون استفاده کنی . این متد چه کار می کند ؟ تمام منابع استفاده شده در کلاسی که این متد را فراخوانی می کند رها می کند برای ساده تر شدن کار اگر تمام سازنده ها را بعد از اتمام کار از بین ببرید ديگر نيازی به متد Dispose هم نيست . برای این کار تمام متغيير هات رو دريک رويه تعريف کن و به آنها مقدار بده



Private Sub SaveImage(ByVal Im As Image)
Dim Sfd As New SaveFileDialog
Dim Img As Image = Nothing
If Sfd.ShowDialog = Windows.Forms.DialogResult.OK Then
Img.Save(Sfd.FileName)
End If
End Sub

Private Function LoadImage() As Image
Dim Ofd As New OpenFileDialog
Dim Img As Image = Nothing
If Ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
Img = New Bitmap(Ofd.FileName)
End If
Return Img
End Function

Private Sub SaveBt_Click() 'with handle
SaveImage(Picbox.Image)
Picbox.Dispose()
End Sub

Private Sub LoadBt_Click() 'with handle
Picbox.Image = LoadImage()
End Sub


مديريت منابع مهمترين قسمت در برنامه نوِسی شيئ گراست . سازنده ها و نابود کننده ها را بايد بدانيد و بشناسيد .
"اگه راجع به Drawing2d اطلاعات داريد لطفا یه یر به اينجا بزنيد
http://barnamenevis.org/forum/showthread.php?t=257203
ممنون"

vahab2010
سه شنبه 18 آبان 1389, 23:11 عصر
من يه برنامه برات ميزارم كد نويسي اش خيلي ساده يه شايد به دردت بخوره

alimanam
چهارشنبه 19 آبان 1389, 17:30 عصر
با سلام

شما هنوز این مشکل به این سادگی رو حل نکردین !!! :متعجب: من که بهتون مسیر رو با کد نشون دادم !!!


ولی باز هم همون مشکل قبلی تکرار شد.با همون کد هایی که شما نوشتید:افسرده:
جلاالخالق !!! یعنی VS من با مال شما فرق میکنه که مشکل شما حل نشد ؟ :گیج: فایل ضمیمه عین درخواست شماست که در همان پست اول داده بودین . موفق باشید .

ho_612
جمعه 03 دی 1389, 22:47 عصر
با اینکه موضوع قدیمی شده فقط جهت اطلاع alimanam :
شما بعد از اجرای برنامه ای که نوشتید مراحل زیر رو به ترتیب انجام بدید. اسم پیغامی که سیستم به شما میده رو چی میگذارید؟؟!!!!!!
1.Load Image
2.Select Image
3.Save Image