PDA

View Full Version : فراخوانی یک عکس از ListBox به PictureBox , و بالعکس



SilverGold
شنبه 17 دی 1390, 08:29 صبح
سلام به همه دوستان برنامه نویس

نگاه کنید من تونستم با کدهای زیر عسکهایی رو داخل یک فایل TIF ذخیره کنم یعنی چند عکس حتما به درد دوستان میخوره این کار من برای من که خیلی کاربرد داره

حالا یک مشکل خوردم اون هم اینکه اگه من یک عکس رو بتونم داخل لیست باکس اضافه کنم چطور می تونم اون رو فراخوانی بکنم یعن معکوس عمل کنم
در لیست باکس چند تا عکس وجود داره میخوام با انتخاب یک عکس اون رو دوباره به یک PictureBox برگردونم
Imports System
Imports System.IO
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Drawing.Imaging
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Data



Public Class FrmTIFF


Private Sub FrmTIFF_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

End Sub

Private Sub button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button4.Click

If Me.listBox1.Items.Count = 0 Then Return

Dim dlg As New SaveFileDialog
dlg.Filter = "TIFF files|*.tiff"
dlg.FileName = Me.Text
If dlg.ShowDialog() = DialogResult.OK Then
If Me.listBox1.Items.Count > 1 Then

'the first item in the list is the master frame.
Dim ii As ImageItem = CType(Me.listBox1.Items(0), ImageItem)
Dim MasterBitmap As Bitmap = CType(ii.Image, Bitmap)

'Select the image encoder
Dim enc As Encoder = Encoder.SaveFlag
Dim info As ImageCodecInfo = Nothing
Dim ice As ImageCodecInfo

For Each ice In ImageCodecInfo.GetImageEncoders()
If ice.MimeType = "image/tiff" Then
info = ice
End If
Next ice

Dim ep As New EncoderParameters(1)
ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.MultiFrame))

'Save the master bitmap

MasterBitmap.Save(dlg.FileName, info, ep)
ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.FrameDimensionPage))

'add all images from index 1 to n

Dim i As Integer

For i = 1 To (Me.listBox1.Items.Count) - 1
ii = CType(Me.listBox1.Items(i), ImageItem)
MasterBitmap.SaveAdd(ii.Image, ep)
Next i

ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.Flush))

'close out the file.
MasterBitmap.SaveAdd(ep)

Else

'do a simple save...
CType(Me.listBox1.Items(0), ImageItem).Image.Save(dlg.FileName, ImageFormat.Tiff)
End If

Me.Text = dlg.FileName
End If
End Sub

Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
Dim dlg As New OpenFileDialog
dlg.Filter = "Image files|*.bmp;*.tiff;*.jpg;*.gif"

If dlg.ShowDialog() = DialogResult.OK Then
DoOpen(dlg.FileName)
End If
End Sub

Private Sub DoOpen(ByVal filename As String)
ClearItems()
'Open the image using a file stream in case the user wants to save
'the image back to the same file.

Dim fs As FileStream = File.Open(filename, FileMode.Open, FileAccess.Read)
Dim bm As Bitmap = CType(Bitmap.FromStream(fs), Bitmap)
If bm.GetFrameCount(FrameDimension.Page) > 1 Then
Dim i As Integer
For i = 0 To (bm.GetFrameCount(FrameDimension.Page)) - 1
bm.SelectActiveFrame(FrameDimension.Page, i)
Dim temp As New Bitmap(bm.Width, bm.Height)
Dim g As Graphics = Graphics.FromImage(temp)
g.InterpolationMode = InterpolationMode.NearestNeighbor
g.DrawImageUnscaled(bm, 0, 0)
g.Dispose()
AddFrameToList(temp, -1)
Next i
Else
AddFrameToList(bm, 0)
End If
fs.Close()
bm.Dispose()
Me.Text = filename
End Sub 'DoOpen
Private Sub ClearItems()
Dim i As Integer
For i = 0 To (Me.listBox1.Items.Count) - 1
Dim item As ImageItem = CType(Me.listBox1.Items(i), ImageItem)
item.Image.Dispose()
Next i
Me.listBox1.Items.Clear()
End Sub 'ClearItems
Private Sub AddFrameToList(ByVal i As Image, ByVal pos As Integer)
If pos = -1 Then
Me.listBox1.Items.Add(New ImageItem(i))
Else
Me.listBox1.Items.Insert(pos, New ImageItem(i))
End If
Me.numericUpDown1.Enabled = True
Me.button3.Enabled = True
Me.button6.Enabled = True
End Sub 'AddFrameToList
Private Sub listBox1_MeasureItem(ByVal sender As Object, ByVal e As System.Windows.Forms.MeasureItemEventArgs) Handles listBox1.MeasureItem
Dim item As ImageItem = CType(Me.listBox1.Items(e.Index), ImageItem)
Dim r As Single = Me.listBox1.ClientSize.Width
r /= item.Image.Width
e.ItemHeight = CInt(r * item.Image.Height)
e.ItemWidth = CInt(r * item.Image.Width)
End Sub 'listBox1_MeasureItem

Private Sub listBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles listBox1.DrawItem
If Me.listBox1.Items.Count < 1 Then
Return
End If
Dim i As ImageItem = CType(Me.listBox1.Items(e.Index), ImageItem)
e.Graphics.DrawImage(i.Image, e.Bounds, 0, 0, i.Image.Width, i.Image.Width, GraphicsUnit.Pixel)
End Sub 'listBox1_DrawItem

Private Sub button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button2.Click
Dim dlg As New OpenFileDialog
dlg.Filter = "Image files|*.bmp;*.jpg;*.gif;*.tif;*.png"
If dlg.ShowDialog() = DialogResult.OK Then
Dim toAppend As Bitmap = CType(Image.FromFile(dlg.FileName), Bitmap)
Me.AddFrameToList(toAppend, -1)
End If
End Sub
Private Sub numericUpDown1_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles numericUpDown1.ValueChanged
If Me.numericUpDown1.Value >= Me.listBox1.Items.Count Then
Me.numericUpDown1.Value = Me.listBox1.Items.Count - 1
End If
End Sub 'numericUpDown1_ValueChanged

Private Sub button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button3.Click
'inserts an image at the index specified by the numeric up-down control.
Dim dlg As New OpenFileDialog

dlg.Filter = "Image files|*.bmp;*.jpg;*.gif;*.tif;*.png"
If dlg.ShowDialog() = DialogResult.OK Then
Dim toAppend As Bitmap = CType(Image.FromFile(dlg.FileName), Bitmap)
Me.AddFrameToList(toAppend, CInt(Me.numericUpDown1.Value))
End If
End Sub


Private Sub button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button6.Click
Me.listBox1.Items.RemoveAt(CInt(Me.numericUpDown1. Value))
If Me.listBox1.Items.Count = 0 Then
Me.numericUpDown1.Enabled = False
Me.button3.Enabled = False
Me.button6.Enabled = False
Return
End If

If Me.numericUpDown1.Value >= Me.listBox1.Items.Count Then
Me.numericUpDown1.Value = Me.listBox1.Items.Count - 1
End If
End Sub

Private Sub button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button5.Click
If MessageBox.Show("Are you sure you want to quit?", "Exit TiffManager", MessageBoxButtons.YesNo) = DialogResult.Yes Then
Application.Exit()
End If
End Sub

Private Sub listBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles listBox1.SelectedIndexChanged
If Me.listBox1.SelectedIndex = -1 Then
Return
End If
Me.numericUpDown1.Value = Me.listBox1.SelectedIndex
Me.PicScanNow.Image = CType(listBox1.SelectedValue, Image)
End Sub 'listBox1_SelectedIndexChanged

درضمن یک فایل کلاس هم داره

Public Class ImageItem
Private _image As Bitmap

Public ReadOnly Property Image() As Bitmap
Get
Return _image
End Get
End Property
Protected Sub New()

End Sub 'New
Public Sub New(ByVal i As Image)
Me._image = CType(i, Bitmap)
End Sub 'New

End Class 'ImageItem

SilverGold
شنبه 17 دی 1390, 08:36 صبح
دوستان محبت کنن سوال من رو هم پاسخ بدن کارم گیر کرده