[ wex-alpha @ 23.06.2010. 13:18 ] @
Ono sto zelim da uradim je da odaberem sliku (HD, USB...). Ta se slika prikaze, i onda na da je snimim na proizvoljnu lokaciju. Ali imam problema.

Koristim OpenFileDialog i image kontrolu za prikaz slike. Evo koda:

Code (csharp):

 Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();

            dlg.Filter = "Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF|All files (*.*)|*.* ";
            if (dlg.ShowDialog() == true)
            {
                Stream stream = File.Open(dlg.FileName, FileMode.Open);
                BitmapImage imgsrc = new BitmapImage();
           
                imgsrc.BeginInit();  
                imgsrc.StreamSource = stream;
                imgsrc.EndInit();
                image1.Source = imgsrc;                

            }

            RenderTargetBitmap rtb = new RenderTargetBitmap(800, 800, 96, 96, PixelFormats.Pbgra32);
            rtb.Render(image1);

            JpegBitmapEncoder jpg = new JpegBitmapEncoder();
            jpg.Frames.Add(BitmapFrame.Create(rtb));
            using (Stream fs = File.Create("c:\\test.jpg"))
            {
                jpg.Save(fs);
            }
           
 



Imam 2 problema sa ovim kodom.

1. Kada odaberem sliku prvi put (ne zatvaram program), on napravi samo crnu sliku. Kada odaberem drugu sliku onda program snimi prvu sliku. Dakle kasni... kako????


2. Drugi problem je "This file is in use". To se desava ako odaberem istu sliku.
Probao sam da ga rijesim dodavanjem sljedeceg koda:
Code (csharp):

                imgsrc.BeginInit();
                imgsrc.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
                imgsrc.CacheOption = BitmapCacheOption.OnLoad;
                imgsrc.StreamSource = stream;
                imgsrc.EndInit();
                image1.Source = imgsrc;    

 

Ali onda mi program puca na

Code (csharp):

 imgsrc.EndInit();
 


Sa greskom "Key cannot be null".



Muka mi je od ovog koda vise, ako ime jednostavno rjesenje za ono sto zelim... help :)
[ wex-alpha @ 23.06.2010. 16:36 ] @
Rijesio sam problem broj 1. tako sto sam razbio metodu na dvije razlicite metode.


1.
Code (csharp):

Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();

            dlg.Filter = "Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF|All files (*.*)|*.* ";
            if (dlg.ShowDialog() == true)
            {
                Stream stream = File.Open(dlg.FileName, FileMode.Open);
                BitmapImage imgsrc = new BitmapImage();
           
                imgsrc.BeginInit();  
                imgsrc.StreamSource = stream;
                imgsrc.EndInit();
                image1.Source = imgsrc;                

            }

 





2.
Code (csharp):


RenderTargetBitmap rtb = new RenderTargetBitmap(800, 800, 96, 96, PixelFormats.Pbgra32);
            rtb.Render(image1);

            JpegBitmapEncoder jpg = new JpegBitmapEncoder();
            jpg.Frames.Add(BitmapFrame.Create(rtb));
            using (Stream fs = File.Create("c:\\test.jpg"))
            {
                jpg.Save(fs);
            }


 



Sad me interesuje koji je wpf ekvivalent ovome:

Code (csharp):

Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
 
[ mmix @ 23.06.2010. 16:48 ] @
FIle lock dobijas zato sto GDI drzi lock na graphics objektima cak i kad ih nekoristi trenutno. Napravi inmemory kopiju bitmape i disposuj bitmap baziran na fajlu.
[ wex-alpha @ 23.06.2010. 16:52 ] @
Mislis da koristim memorystream?
[ mmix @ 25.06.2010. 09:31 ] @
da, samo ne zaboravi da disposujes bitmap baziran na fajlu (inace lock nece biti oslobodjen dok GC ne finalizuje objekat)