'====================================================' Visualmonsters.cba.pl ==================================================== Imports System.Drawing.Imaging Imports System.IO Imports System.Reflection Imports System.Text 'słownik naszych metadanych Public Enum EXIFProperty Temat = 40095 Tytuł = 40091 Komentarz = 40092 Autor = 40093 Tagi = 40094 End Enum Public Class Form1 Dim lokalizacjaPliku As String 'zmienna przechowująca lokalizacje pliku graficznego Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 'filtr dialogu OpenFileDialog1.Filter = "Image Files (*.jpg, *.jpeg)|*.jpg;*.jpeg|All Files (*.*)|*.*" OpenFileDialog1.Title = "Wybierz format pliku graficznego" OpenFileDialog1.FileName = "" ' Try With OpenFileDialog1 'dialog z użytkownikiem If OpenFileDialog1.ShowDialog() = DialogResult.OK Then lokalizacjaPliku = .FileName 'podpisanie zmiennej Dim fi As New System.IO.FileInfo(lokalizacjaPliku) If fi.Extension.ToLower = ".gif" Or fi.Extension.ToLower = ".bmp" Or fi.Extension.ToLower = ".jpg" Or fi.Extension.ToLower = ".jpeg" Or fi.Extension.ToLower = ".png" Then Dim ImageFileStream As New FileStream(lokalizacjaPliku, IO.FileMode.Open) Dim bm As New Bitmap(ImageFileStream) PictureBox1.SizeMode = PictureBoxSizeMode.Zoom PictureBox1.Image = bm ImageFileStream.Close() 'pobiera metadane z pliku pobierzDaneEXIF() Else 'ustawia obrazek błędu jeśli plik nie jest obrazem PictureBox1.Image = PictureBox1.ErrorImage 'i sprawdzi czy plik zawiera metadane Try pobierzDaneEXIF() Catch ex As Exception MsgBox(ex.ToString) End Try End If End If End With Catch ex As Exception MsgBox(ex.ToString) End Try End Sub Private Sub pobierzDaneEXIF() DataGridView1.Rows.Clear() 'czyści tabele 'otwiera nasz obrazek Dim imgFile As FileStream = New FileStream(lokalizacjaPliku, FileMode.Open, FileAccess.Read) 'ładuje go do zmiennej TheImage Dim TheImage As Image = Image.FromStream(imgFile) 'czyta wszystkie metadane i tworzy tablice AllProperties Dim AllProperties As PropertyItem() = TheImage.PropertyItems 'ładujemy identyfikatory naszych metadanych do listy Dim listaWszystkichPropItem As New List(Of Integer) For i As Integer = 0 To AllProperties.Length - 1 listaWszystkichPropItem.Add(AllProperties(i).Id) Next Dim PropItem As PropertyItem = AllProperties(0) 'uruchamiamy pętle wszystkich znanych przez nas metadanych (tych z Enum) For Each tstEnum As EXIFProperty In System.Enum.GetValues(GetType(EXIFProperty)) DataGridView1.Rows.Add() 'dodaje wiersz DataGridView1.Rows(DataGridView1.Rows.Count - 1).Cells(0).Value = CInt(tstEnum).ToString 'dodaje identyfikator EXIF z enum DataGridView1.Rows(DataGridView1.Rows.Count - 1).Cells(1).Value = tstEnum.ToString 'dodaje tytuł numeru EXIF z enum ' jeśli plik zawiera nasz identyfikator enum wtedy doda go do tabeli If listaWszystkichPropItem.Contains(CInt(tstEnum)) Then DataGridView1.Rows(DataGridView1.Rows.Count - 1).Cells(2).Value = System.Text.Encoding.Unicode.GetString(TheImage.GetPropertyItem(CInt(tstEnum)).Value).ToString End If Next 'zwalnia pamięć imgFile.Close() TheImage.Dispose() End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Dim wszystkieMetadane As String = "" 'zmienna przechowująca nasze identyfikatory Dim imgFile As FileStream = New FileStream(lokalizacjaPliku, FileMode.Open, FileAccess.Read) Dim TheImage As Image = Image.FromStream(imgFile) Dim AllProperties As PropertyItem() = TheImage.PropertyItems Dim listaWszystkichPropItem As New List(Of Integer) 'pętla wypełniająca zmienną wszystkieMetadane For i As Integer = 0 To AllProperties.Length - 1 wszystkieMetadane += AllProperties(i).Id.ToString + " " Next imgFile.Close() TheImage.Dispose() 'komunikat dla użytkownika MsgBox(wszystkieMetadane) End Sub Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click 'otwiera nasz plik w tle Dim imgFile As FileStream = New FileStream(lokalizacjaPliku, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) 'czyta i ładuje wszystkie Byt'y programu do zmiennej Dim fileBytes(imgFile.Length) As Byte imgFile.Read(fileBytes, 0, fileBytes.Length) imgFile.Close() 'ładujemy fileBytes do pamięci komputera Dim MS As MemoryStream = New MemoryStream(fileBytes) 'tworzymy zmienną TheImage Dim TheImage As Image = Image.FromStream(MS) 'ładujemy wszystkie klucze metadanych do listy Dim AllProperties() As PropertyItem = TheImage.PropertyItems Dim PropItem As PropertyItem = AllProperties(0) Dim strNewValue() As Byte 'dodajemu lub aktualizujemy metadane For i As Integer = 0 To DataGridView1.Rows.Count - 1 If Not DataGridView1.Rows(i).Cells(2).Value = "" Then strNewValue = System.Text.ASCIIEncoding.Unicode.GetBytes(DataGridView1.Rows(i).Cells(2).Value) PropItem.Id = DataGridView1.Rows(i).Cells(0).Value PropItem.Len = strNewValue.Length PropItem.Value = strNewValue PropItem.Type = 1 TheImage.SetPropertyItem(PropItem) End If Next 'zapisujemy obrazek z pamięci komputera TheImage.Save(lokalizacjaPliku) MS.Close() TheImage.Dispose() End Sub End Class