Avatar billede glenn007 Nybegynder
03. januar 2009 - 15:19 Der er 10 kommentarer og
1 løsning

låser gemt billede

Hejsa,

Hvorledes kan man frigøre et bitmap der er gemt således så man kan overskrive det uden videre. jeg har bøvl med at når jeg har indlæøst billedet at den så ikke vil lade andre resourcer i mit program bruge det.

har prøvet med bitmap.Dispose();  men det gjorde igen forskel.

nogen der kender en metode.
Avatar billede driis Nybegynder
03. januar 2009 - 15:29 #1
Hvordan gemmer du det ? Hvis du bruger en FileStream, kan det være det er den, der ikke bliver lukket.
Avatar billede glenn007 Nybegynder
03. januar 2009 - 15:54 #2
jeg har gjort således og den gemmer det fint, men tillader bare ikke at jeg overskriver det igen
///////////////////////////////////

using (Bitmap thisbitmap = new Bitmap(SelectionRectangle.Width, SelectionRectangle.Height))
            {
             
                using (Graphics g = Graphics.FromImage(thisbitmap))
                {
                    g.CopyFromScreen(SourcePoint, DestinationPoint, SelectionRectangle.Size);
                }
               
             
                string savePath = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) + @"\myfoto.bmp";
            Bitmap bitmap2 = (thisbitmap);

                bitmap2.Save(savePath);
              bitmap2.Dispose();



////////////////////////////////////////////////////////////////
Avatar billede glenn007 Nybegynder
03. januar 2009 - 15:57 #3
det er samme bilelde som jeg indlæser der skal overksrives. og har lagt mærke til at den heller ikke lader mig slette det indlæste billede for hele mit program fysiks er lukket ned. så det er nok en slags write protection den holder fast på.
Avatar billede aaberg Nybegynder
03. januar 2009 - 20:49 #4
Prøv

using (Bitmap thisbitmap = new Bitmap(SelectionRectangle.Width, SelectionRectangle.Height))
{
           
  using (Graphics g = Graphics.FromImage(thisbitmap))
  {
      g.CopyFromScreen(SourcePoint, DestinationPoint, SelectionRectangle.Size);
  }
 
  string savePath = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) + @"\myfoto.bmp";

  using (FileStream stream = new FileStream(savePath, FileMode.Create))
  {
      thisbitmap.Save(stream, ImageFormat.Bmp);
      stream.Close();
  }
}
Avatar billede glenn007 Nybegynder
04. januar 2009 - 12:41 #5
Nå fik rodet lidt rundt med det og det hjalp faktisk. Men der opstod så en konflikt et andet sted der ligner lidt. det er så den der igen  LÆSER filen der låser den. så andre igen ikke kan komme til den. Her skal den kun læse og frigøre den straks igen. så andre kan skrive på billedet.

jeg gør således hvis du også har et forslag til en løsning der.

public static Bitmap getBitmap()
        {

   

          Bitmap bm = new Bitmap("C://Documents and Settings/scanb/My Documents/My Pictures/foto.bmp");
         
           
            return bm;
        }
Avatar billede glenn007 Nybegynder
04. januar 2009 - 12:42 #6
du må iøvrigt meget geren smide et svar aaberg, for du løste jo opgaven til UG i første omgang  :)
Avatar billede aaberg Nybegynder
04. januar 2009 - 15:02 #7
Jeg ville tro at den kode du giver et eksempel på, lukker filen så snart den er læst. Men hvis det ikke virker, kan du jo prøve dette:

public static Bitmap getBitmap()
{
  Bitmap bm;
  using (FileStream stream = new FileStream("C://Documents and Settings/scanb/My Documents/My Pictures/foto.bmp", FileMode.Open, FileAccess.Read))
  {
      bm = new Bitmap(stream);
      stream.Close();
  }

  return bm;
}
Avatar billede glenn007 Nybegynder
05. januar 2009 - 13:15 #8
Nu fulgte jeg din vejledning og skrev således og så godt så langt. Men kunne man evt. tiløje lidt kode så den venter i tilfælde af at den ikke kan tilgå filen hvis den er optaget af anden process og evt gør noget andet imens den venter.



Bitmap bm;
            using (FileStream stream = new FileStream("C://Documents and Settings/scanb/My Documents/My Pictures/foto.bmp", FileMode.Open, FileAccess.Read))
            {
                bm = new Bitmap(stream);
                stream.Close();
            }

            return bm;
Avatar billede aaberg Nybegynder
05. januar 2009 - 13:39 #9
Er det nødvendigt at der er flere processer der skal tilgå billedet samtiddig?

Du kan eventuelt bruge noget try-catch til at prøve igen. Denne kan bruges i en for-løkke, hvis der f.eks. skal prøves 3 gange før den giver op. Brug Thread.Sleep() til at sætte metoden til at vente lidt tid, før den prøver igen.

Hvis programmet skal gøre noget andet i mellemtiden, skal du bruge noget multithreading. Dette vil jeg ikke anbefale, med mindre det er højest nødvendigt. Multithreading skaber ofte flere problemer end det løser.
Avatar billede glenn007 Nybegynder
06. januar 2009 - 11:57 #10
Nej det er ikke nødvendigt. Dog skal den kunne lukke meget hurtigt da billederne kan blive laoded med op ned til et sekunds mellemrum og billederne er lidt store nogle gange.

men prøvede try catch.
DET KØRER ( det er nok min harddisk der også sætter sine begrænsninger for hvor hurtigt man kan tilgå det gemte igen. for det må jo også have meget at sige hvor hurtig en disk man har og hvor hurtige ram ... jeg ved ikke hvordan man måler minimums krav til en pc ifm. hvor krævende programmer er )

MEN jeg er lidt nervøs for jeg mangler en vital fejl håndtering i den try sætning jeg har lavet ( kan jeg ikke risikere den kører i en uendelig løkke når jeg har gjort sådan her

------------

using (Bitmap thisbitmap = new Bitmap(SelectionRectangle.Width, SelectionRectangle.Height))
            {

                using (Graphics g = Graphics.FromImage(thisbitmap))
                {
                    g.CopyFromScreen(SourcePoint, DestinationPoint, SelectionRectangle.Size);
                }

                string savePath = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) + @"\foto.bmp";
                try
                {
                    using (FileStream dstream = new FileStream(savePath, FileMode.Create))
                    {
                        thisbitmap.Save(dstream, ImageFormat.Bmp);
                        dstream.Close();
                    }
                }
                catch
                {
                }
            }


med denne kode for jeg ikke flere fejl og det kører fejlfrit. måske lidt langsomt til tider men det kan jo være min pc.
Avatar billede aaberg Nybegynder
06. januar 2009 - 12:20 #11
Prøv i stedet at gøre noget lignende dette, som vil prøve op til 10 gange med 100ms mellemrum:

int maxNumberOfTries = 10;

using (Bitmap thisbitmap = new Bitmap(SelectionRectangle.Width, SelectionRectangle.Height))
{

  using (Graphics g = Graphics.FromImage(thisbitmap))
  {
      g.CopyFromScreen(SourcePoint, DestinationPoint, SelectionRectangle.Size);
  }

  string savePath = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) + @"\foto.bmp";

  // Prøver at gemme op til 10 gange i denne løkke.
  for (int tryIdx = 1; tryIdx <= maxNumberOfTries; tryIdx++)
  { 
      try
      {
        using (FileStream dstream = new FileStream(savePath, FileMode.Create))
        {
            thisbitmap.Save(dstream, ImageFormat.Bmp);
            dstream.Close();
        }
      }
      catch(Exception ex)
      {
        // Hvis der opstår en fejl, ventes der i 100 ms, hvorefter løkken startes forfra.
        // Hvis dette er 10. gang den fejler, kastes fejlen.
        if (tryIdx == maxNumberOfTries)
            throw ex;

        Thread.Sleep(100);
        continue;
      }
     
      //Hvis koden kommer hertil, er alt gået som det skal. Der breakes ud af køkken.
      break;
  }
}
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