Dodanie daty do zdjęcia z EXIF

0

Witam serdecznie
Otóż mam takową zagwozdkę...
Piszę program do dodawania na obrazek daty jego zrobienia.
Wczytuje obrazek, wyskakuje MessageBox z poprawną datą zrobienia fotki, mogę także zapisać.
Program po wczytaniu ma od razu dodać datę, a potem wyświetlić podgląd. (Podgląd działa)
Ale nie potrafię "napisać" na zdjęciu tej daty.

Aby lepiej zobrazować sytuację, jak to ma wyglądać wrzucam foto:
user image

Tutaj programik:
http://www66.zippyshare.com/v/Rh5vgAfi/file.html

Jeśli ktoś mógłby mnie nakierować na rozwiązanie problemu to będę wdzięczny.

1

https://www.google.pl/search?q=c%23+draw+text+on+jpg w pierwszym linku masz z obrazkami

0

Dziękuje ślicznie.
A czy jest możliwość przerobienia pętlą 100 zdjęć? Nawet nie musi być podglądu :)

1

Oczywiście, że jest.

Robisz sobie tablicę/listami z wszystkimi zdjęciami które chcesz przerobić i dla każdego w pętli wywołujesz np stworzoną przez siebie funkcję: AddDataToImage(Image image)

0

Mam problem dość dziwny i nie wiem jak sobie z nim poradzić.
Owszem wczytuje zdjęcia do programu (np 100) odpowiednio odczytuje wartości na każdym ale przy ich zapisie wyskakuje 100 razy okno Zapisu...
I nie wiem jak sobie z tym poradzić.

kod:

 {
            OpenFileDialog otworz = new OpenFileDialog();
            otworz.InitialDirectory = "c:\\";
            otworz.Multiselect = true;
            otworz.Filter = "Wszystkie pliki (*.*)|*.*|Pliki JPEG (*.jpeg)|*.jpeg| Pliki JPG (*.jpg)|*.jpg";

            if (otworz.ShowDialog() == DialogResult.OK)
            {
                StringBuilder sb = new StringBuilder();
                foreach (string cell in otworz.FileNames)
                {
                    sb.AppendLine(cell.ToString());                   
                }
                MessageBox.Show(sb.ToString());

                foreach (string plik in otworz.FileNames)
                {
                    FileInfo info = new FileInfo(plik);
                    DateTime create = info.LastWriteTime;
                    //MessageBox.Show(create.ToString(), "Data utowrzenia zdjęcia", MessageBoxButtons.OK);
                    Bitmap nowa_bitmapa = new Bitmap(plik);
                    Graphics dopisz = Graphics.FromImage(nowa_bitmapa);
                    dopisz.DrawString(create.ToString(), new Font("Times New Roman", 72), Brushes.White, new PointF(0, 0));
                    pictureBox1.Image = (Image)nowa_bitmapa;
                    
                    SaveFileDialog zapisz = new SaveFileDialog();
                    zapisz.InitialDirectory = "c:\\";
                    zapisz.Filter = "Pliki JPEG (*.jpeg)|*.jpeg| Pliki JPG (*.jpg)|*.jpg";
                    if (zapisz.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        string ext = System.IO.Path.GetExtension(zapisz.FileName);
                        nowa_bitmapa.Save(zapisz.FileName);
                        //pictureBox1.Image.Save(zapisz.FileName);
                    } 
                }
            }
        } 

Chciałbym zachować SaveFileDialog, bo osoba, która by obsługiwała program musi mieć jasno i czytelnie ;)

1

spróbuj tak:

 string ImagesPath = @"D:\Test"; //uzyj FolderBrowserDialog albo cos podobnego..

            if (Directory.Exists(ImagesPath))
            {
                Directory.CreateDirectory(Path.Combine(ImagesPath, "WithDate"));

                List<string> Images = Directory.EnumerateFiles(ImagesPath, "*.png").ToList();
                foreach (string ImagePath in Images)
                    if (File.Exists(ImagePath))
                        using (Bitmap bmp = new Bitmap(ImagePath))
                        {
                            using (Graphics graphics = Graphics.FromImage(bmp))
                            {
                                graphics.DrawString(DateTime.Now.ToShortDateString(), new Font("Times New Roman", 20), Brushes.Red, new PointF(bmp.Size.Width - 200, bmp.Size.Height - 50)); //zamien date
                            }

                            bmp.Save(string.Concat(Path.Combine(ImagesPath, "WithDate", Path.GetFileName(ImagePath))));
                        }
            }

na szybko, ale powinno działać.

0

Ok, z pomocą kolegi uporałem się z problemem. Dziękuje :)

0

Jeszcze jakby ktoś pomógł mi z progress barem i bym skończył program :)

Chodzi mi, aby pokazywał na progressbar miejsce, w którym jest postęp pracy przy zapisie np 100 fot.

 

            if (otworz.ShowDialog() == DialogResult.OK)
            {
                pliki.Clear();
                StringBuilder sb = new StringBuilder();
                foreach (string cell in otworz.FileNames)
                {
                    sb.AppendLine(cell.ToString());                    
                }

               // MessageBox.Show(sb.ToString());

                FolderBrowserDialog zapisz = new FolderBrowserDialog();
                zapisz.RootFolder = Environment.SpecialFolder.DesktopDirectory;
                if (zapisz.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    System.Drawing.Font font = new Font("Times New Roman", 100);
                    Bitmap nowa_bitmapa = null;

                    foreach (string plik in otworz.FileNames)
                    {
                        nowa_bitmapa = new Bitmap(plik);

                        using (Graphics dopisz = Graphics.FromImage(nowa_bitmapa))
                            dopisz.DrawString(new FileInfo(plik).LastWriteTime.ToString(), font, Brushes.White, new PointF(0, 0));

                        string sciezka = string.Format("{0}//{1}_edit{2}", zapisz.SelectedPath, Path.GetFileNameWithoutExtension(plik), Path.GetExtension(plik));
                        pliki.Add(sciezka);
                        listBox1.Items.Add(Path.GetFileName(sciezka));
                        nowa_bitmapa.Save(sciezka);
                    }

Ogólnie nie potrafię zastosować tutaj backgroundProgressBar :s

1 użytkowników online, w tym zalogowanych: 0, gości: 1