Avatar billede koppelgaard Praktikant
20. oktober 2007 - 08:01 Der er 18 kommentarer og
1 løsning

to tråde på et billede

Hej alle Jeg har et problem med noget en billedbrowser, som jeg er begyndt at lave. Billedbrowseren viser i form1 i 4 pictureboxe  4 billeder som er taget efter hinanden , så jeg kan sammenligne næsten ens billeder og slette de dårligste.
Jeg bladre gennem billederne med pil  til højre og venstre eller pgUp og pgDown. Ved dobbeltklik på et af billederne var det meningen, at jeg skulle kunne slette, det men det virker ikke. En anden proces bruger billedet, får jeg at vide, og jeg har slette billedet alle de steder jeg kan tænke mig.
Jeg har kun forsøgt at implementer sletningen for den ene af de 4 pictureboxe.

Jeg gemmer billeder loaded fra disk i en liste :
bitmapList = new List<System.Drawing.Image>()

jeg har på fornemmelsen, at det er fordi systemet ikke er færdig med at slette billedet i liste at jeg ikke kan få lov til at slette den på disk.
Men hvordan klare jeg problemet?


//form1.cs:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
namespace PictureBrowser
{
    public partial class Form1 : Form
    {       
        ConPicture p;
        public PictureBox picBox1;
        public PictureBox picBox2;
        public PictureBox picBox3;
        public PictureBox picBox4;
     
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {     
            p = new ConPicture(this);
            picBox1 = pictureBox1;
            picBox2 = pictureBox2;
            picBox3 = pictureBox3;
            picBox4 = pictureBox4;

            pictureBox1.Image = p.GetImage(0);
            pictureBox2.Image = p.GetImage(1);
            pictureBox3.Image = p.GetImage(2);
            pictureBox4.Image = p.GetImage(3);
           
        }

       

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {           
            if (e.KeyCode == Keys.Right)
            {
                p.PushPicture(1);
            }           
           
            if (e.KeyCode == Keys.Left)
            {
                p.PushPicture(-1);
            }

            if (e.KeyCode == Keys.PageDown)
            {
                p.PushPicture(4);
            }

            if (e.KeyCode == Keys.PageUp)
            {
                p.PushPicture(-4);
            }
        }       

        private void pictureBox1_MouseDoubleClick(object sender, MouseEventArgs e)
        {//delete
            p.deletePicture(0);

        }   
     
        }       
    }
ConPicture.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Drawing;
using System.Windows.Forms;

namespace PictureBrowser
{
    public class ConPicture
    {
        FileInfo[] fi;
        string myPath;
        List<System.Drawing.Image> bitmapList = null;
        int pic1_Number;//PicturePointer
        private Form1 f;

        public ConPicture(Form1 f)
        {
            myPath = @"c:\Documents and Settings\Michael\Dokumenter\Billeder\Kopi af Himmelbjerget Efterårsferie 13 okt\";
            this.f = f;
            DirectoryInfo d = new DirectoryInfo(myPath);
            fi = d.GetFiles("*.jpg");
            //for storing pictures, not to be loaded again
            bitmapList = new List<System.Drawing.Image>();
            pic1_Number = 0;
        }

        public System.Drawing.Image GetImage(int i)
        {
            //if ending of bitmapList and still more pic in fi
            // then add a picture
            if (bitmapList.Count == i && fi.Length > i)
                bitmapList.Add(Image.FromFile(fi[i].FullName));
            if (bitmapList.Count > i && i >= 0)
                return bitmapList[i];
            else
                return null;
        }
        public void PushPicture(int jump)
        {
            pic1_Number = pic1_Number + jump;
            f.picBox1.Image = GetImage(pic1_Number + 0);
            f.picBox2.Image = GetImage(pic1_Number + 1);
            f.picBox3.Image = GetImage(pic1_Number + 2);
            f.picBox4.Image = GetImage(pic1_Number + 3);
        }
        public void deletePicture(int i)
        {//i is picbox number
            MessageBox.Show(fi[pic1_Number + i].FullName);           
     
            try
            {
                bitmapList.RemoveAt(i);
                f.picBox1.Image = null;
                File.Delete(fi[pic1_Number + i].FullName);
            }
            catch
            {
                return;

            }
        }

    }
}
Avatar billede nielle Nybegynder
20. oktober 2007 - 09:09 #1
Sådan?

        public void DeletePicture(int i)
        {
            // i is picbox number
            MessageBox.Show(fi[pic1_Number + i].FullName);

            try
            {
                f.picBox1.Image.Dispose();
                f.picBox1.Image = null;

                bitmapList.RemoveAt(i);

                fi[pic1_Number + i].Delete();
            }
            catch (Exception e)
            {
                MessageBox.Show("E!: " + e.Message);
                return;
            }
        }
Avatar billede koppelgaard Praktikant
20. oktober 2007 - 12:33 #2
Tak for svaret!!!
Nu kan jeg slette første gang, men når jeg bruge pil til højre, hvorved et nyt billede vises i picturebox1 kan jeg ikke. Billedet bruges af en anden proces.
Kan du knække den ?
Avatar billede nielle Nybegynder
20. oktober 2007 - 12:49 #3
Ikke uden at skrive store dele af din kode om :^|

Problemet er at du har to arrays til at holde styr på billederne: bitmapList og fi. Det betyder at du skal holde tungen lige i munden hver gang at du sletter billeder, eller flytter billederne rundt i dine pictureBox'e. En af fælderne er at indexene jo ændre sig med en faktor 1 hver gang at du sletter i et af arrayens.

Jeg vil råde dig til at du prøver at eliminere den ene af listerne. Eller måske slå en System.Drawing.Image og en FileInfo sammen i et objet - og at det så er denne type obgjekter du har i din liste. Dette gør det meget nemmeer at slette de sammenhørende Image og FileInfo objekter på en gang.

Desuden har du nogle pictureBox'e som holder en lås på billederne indtil at du Disposer() dem. Den skal du også lige have styr på.
Avatar billede koppelgaard Praktikant
20. oktober 2007 - 14:27 #4
Nu er jeg vist på glat is - hvordan vil du slå  System.Drawing.Image og en FileInfo sammen i et objekt ?
Og hvad forstår du ved dispose() ?
Avatar billede nielle Nybegynder
20. oktober 2007 - 14:33 #5
Dispose som på samme måde som i 20/10-2007 09:09:29. Den fejlede første gang fordi at

f.picBox1.Image = null;

ikke frigiver sit hold på billedet hurtigt nok i forhold til din kode. Detet klares ved at Dispose den.
Avatar billede koppelgaard Praktikant
20. oktober 2007 - 14:42 #6
Nå ja selvfølgelig : et objekt med System.Drawing.Image som een property og FileInfo som en anden. Og så en et containerobjekt, som kan gemme objekter af denne type. Dette containeropjekt skal have en delete/remove metode.

Er jeg på sporet ?

Men det jeg lavede lille test: hvor jeg havde et billede repræsenteret som et fileinfo og indsat i en box. Alligevel kunne jeg uden problemer slette det på hardisken.
Avatar billede nielle Nybegynder
20. oktober 2007 - 15:04 #7
Jeg sidder og bikser med det. Foreløbigt har jeg:

    class ExtFileInfo
    {
        private System.IO.FileInfo fi;
        private System.Drawing.Image bitmap;

        public ExtFileInfo(System.IO.FileInfo fi)
        {
            this.fi = fi;
            this.bitmap = null;  // Vi loader først billedet når nogen spørger.
        }

        public System.Drawing.Image GetImage()
        {
            if (bitmap != null)
                bitmap = System.Drawing.Image.FromFile(fi.FullName);

            return bitmap;
        }
    }

og listen oprettes f.eks. sådan:

        List<ExtFileInfo> billedList;
        public ConPicture(Form1 f)
        {
            this.f = f;

            myPath = @"C:\Source.Net20\e801891\Pictures";

            billedList = new List<ExtFileInfo>();

            DirectoryInfo d = new DirectoryInfo(myPath);
            FileInfo[] fiArr = d.GetFiles("*.jpg");
            foreach (FileInfo fi in fiArr)
            {
                ExtFileInfo efi = new ExtFileInfo(fi);
                billedList.Add(efi);
            }

            pic1_Number = 0;
        }

hvorefter du f.eks. kunne have:

        public System.Drawing.Image GetImage(int i)
        {
            if (i < 0 || billedList.Count <= i)
                return null;

            return billedList[i].GetImage();
        }
Avatar billede nielle Nybegynder
20. oktober 2007 - 15:06 #8
Som sagt er det noget som kræver en større omskrivning.

Jeg ville iøvrigt lægge sletningen ind i ExtFileInfo klassen.

Desuden er det også nok en fordel, hvis den ved hvilken pictureBox der bruger billedet, sådan at den samtidigt med sletningen kan kalde disopse på denne.
Avatar billede nielle Nybegynder
20. oktober 2007 - 15:08 #9
Du kan selvfølgelig selv vælge at lave Image og FileInfo som propertes i stedet for den kode jeg har lagt op til. :^)
Avatar billede nielle Nybegynder
20. oktober 2007 - 15:08 #10
Fejl er gratis:

        public System.Drawing.Image GetImage()
        {
            if (bitmap == null)  // Rettet her...
                bitmap = System.Drawing.Image.FromFile(fi.FullName);

            return bitmap;
        }
Avatar billede koppelgaard Praktikant
20. oktober 2007 - 15:35 #11
aha fejl i min kode. Jeg skal have gæster så må haste videre. ser senere på det!!!!
Tak indtil videre !!
Avatar billede nielle Nybegynder
20. oktober 2007 - 15:39 #12
Cool - c-yah :^)
Avatar billede koppelgaard Praktikant
21. oktober 2007 - 14:13 #13
Jeg er ked af det, men jeg er ikke helt med på din løsning.
public System.Drawing.Image GetImage()
        {
            if (bitmap == null)  // Rettet her...
                bitmap = System.Drawing.Image.FromFile(fi.FullName);

            return bitmap;
        }

kan  den umiddelbart erstatte min metode ?

Michael
Avatar billede nielle Nybegynder
21. oktober 2007 - 14:16 #14
Nej det var vist bare mig som vrøvlede der ...
Avatar billede koppelgaard Praktikant
21. oktober 2007 - 16:19 #15
Ahh, ok så er jeg ikke hel dum.
Jeg vil gøre, som du anbefalede og lave et objekt som beskrevet.
Kan du hænge på et par dage i nu?
Sagen er at jeg overhovedet ikke har mere tid lige nu, og jeg vil jo gerne have dig med, som ekspert det sidste stykke.
Du skal nok få dine point !!!!!!!!

:-) michael
Avatar billede nielle Nybegynder
21. oktober 2007 - 17:59 #16
Selvfølgelig hænger jeg på - det plejer jeg da at gøre. :^)
Avatar billede koppelgaard Praktikant
22. oktober 2007 - 12:45 #17
KANON JEG SER PÅ SET SÅ SNART JEG HAR TID !
Avatar billede koppelgaard Praktikant
28. oktober 2007 - 08:09 #18
Og nu har jeg haft tid - endelig.
Og det virker.
Jeg lægger min kode ud, når jeg lige har finpudset.
Måske du så har et par bemærkninger ?

Men du kan roligt sende et svar -det kører!
Avatar billede nielle Nybegynder
28. oktober 2007 - 09:15 #19
Glæder mig til at se den finpudsede kode, og skal gerne kommentere.

I mellemtiden får du et svar :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester