20. oktober 2007 - 08:01Der 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;
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);
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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 ?
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å.
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.
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;
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.
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);
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 !!!!!!!!
Glæder mig til at se den finpudsede kode, og skal gerne kommentere.
I mellemtiden får du et svar :^)
Synes godt om
Ny brugerNybegynder
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.