PictureBox loses its image on navigating to different application - c#

I started developing Windows Forms Applications recently. I'm working with PictureBox and I'm facing an issue with it. It is losing the image as shown in below pictures when I navigate out or if I minimize it and open it back. Any help is greatly appreciated.
private void button1_Click(object sender, EventArgs e) {
try {
using (FileStream fs = new FileStream("C:\\Users\\Public\\Pictures\\Sample Pictures\\Penguins.jpg", FileMode.Open, FileAccess.Read)) {
using (Image original = Image.FromStream(fs)) {
Bitmap image1 = (Bitmap)original;
pictureBox1.Image = image1;
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox1.Refresh();
}
}
}
catch (System.IO.FileNotFoundException) {
MessageBox.Show("There was an error opening the bitmap." +
"Please check the path.");
}
}
Forms Application before Navigating
Forms Application after Navigating to another app or minimizing it

This is because you are disposing the image
using (Image original = ....
{
Bitmap image1 = (Bitmap)original;
// ...
}
image1 is the same object as original, just cast to Bitmap, and gets disposed right after being painted on the screen (with Refresh method).
To fix the problem, use the following instead
Bitmap image1 = new Bitmap(original);
// ...

Related

Replace image with new image

when i try to delete the image i get this error i tried to dispose of the picture box but that doesn't seem to work.
System.IO.IOException: 'The process cannot access the file
'C:\Users*******\Documents\Visual Studio
2019\Project****************\dbo\DBImages\Bolgheri Sassicaia.jpg'
because it is being used by another process.'
the image i load from this folder, i want to delete it and then add another picture with the same name.
pretty much i want to update the image.
This is where i load the image to the picture box
if (imagepathtext.TextLength > 0)
{
image1 = Image.FromFile(imagepathtext.Text);
drinkImageView.Image = image1;
}
This is where i try to replace the image.
private void UpdatebtnClick(object sender, EventArgs e)
{
if (imagepath.TextLength > 9)
{
DialogResult result = MessageBox.Show("Are you also trying to
update image?", "Confirmation", MessageBoxButtons.YesNo);
if (result == DialogResult.Yes)
{
image1.Dispose();
System.IO.File.Delete(imagepathtext.Text);
}
}
}
You have to dispose image1 object to close file handle. This is actual object keeping handle to your file.
Before this call
System.IO.File.Delete(imagepathtext.Text);
make sure to dispose image1 object
image1.Dispose();
So i figured it out after long trials and error.
We have to dispose of the image before loading the new image.
like so
private void BrowseImage_Click(object sender, EventArgs e)
{
DrinkView.Image.Dispose();
var imagePath = image.BROWSEIMAGE();
if (imagePath.Length > 10)
{
DrinkView.Image = new Bitmap(imagePath);
imagepath.Text = imagePath;
}
}

Image.FromFile and picturebox won't display image from computer

I'm using Winforms and have a picturebox. When the user clicks on it, I want to load a image from my computer. But its not working. Any ideas why?
private void pictureBox1_Click(object sender, EventArgs e)
{
pictureBox1.Image = Image.FromFile("C:/wamp/www/cyber.jpeg");
pictureBox1.Image = new Bitmap(#"C:\wamp\www\cyber.jpeg");
}
If I click on it, I get the error "FileNotFoundException was unhandled". If I remove the Image.FromFile and use the Bitmap instead, I get the error "Parameter is not valid"
try this
pictureBox1.Image = Image.FromFile(#"C:\wamp\www\cyber.jpeg");
Assuming your filepath is correct , I think You have .jpg as extension for your image but you are trying to access with extension .jpeg
Try This:
pictureBox1.Image = Image.FromFile("C:/wamp/www/cyber.jpg");

How to overlay two images in C#

So ive tried following a load of different tutorials on Stack and the internet on how to do this, but i'm getting nowhere.
this is the closest ive gotten:
private void button1_Click(object sender, EventArgs e)
{
Image image1 = Image.FromFile("S:\\Software\\C#\\Project\\WindowsFormsApplication1\\1.png");
Image image2 = Image.FromFile("S:\\Software\\C#\\Project\\WindowsFormsApplication1\\2.png");
using (Graphics g = Graphics.FromImage(image1))
{
g.DrawImageUnscaled(image2, 0, 0);
}
}
And when i click my button, it executes the code but literally nothing happens, why is this?
You have to do something with your image object afterwards. You have at least two possibilities:
Either save it back to a file using the Image.Save method, e.g.
image1.Save("S:\\Test.jpg");
or place a PictureBox on your Form and put it in there
PictureBox1.Image = image1;
...to place it in a new Window:
Form imgForm = new Form();
imgForm.BackgroundImage = image1;
imgForm.Show();

Changing a Windows Phone Application's WritableBitmap Object

All, I have a basic Windows 7 Phone application and I have just finished a crop page, where the users are able to crop an image taken with the phones camera. In the cameraCapTask_Completed event I set the App's global WritableBitmap
public static WriteableBitmap capturedImage;
as follows
void cameraCapTask_Completed(object sender, PhotoResult e)
{
if (e.TaskResult == TaskResult.OK && e.ChosenPhoto != null)
{
// Take JPEG stream and decode into a WriteableBitmap object.
App.capturedImage = PictureDecoder.DecodeJpeg(e.ChosenPhoto);
When I take a picture I then pass it to the cropping page in the CropProcessPage constructor I set the Image in the page via
public CropProcessPage()
{
InitializeComponent();
// Set the text and display captured image.
imageMain.Source = App.capturedImage;
This works. However, when I go back to the Main Page and retake/take another image, when I try to the new image, the old image (the first one taken) is shown. The constructor is being called and so is the camera captured event (setting the new image). What am I doing wrong here?
In CropProcessPage
move line
imageMain.Source = App.capturedImage;
to
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
// Set the text and display captured image.
imageMain.Source = App.capturedImage;
}

How to notify PropertyChanged after Image Opened?

I am having some problems with my gallery. First I download all thumbnails for an overview. But when I click on a picture, first I want to show the thumbnail and load the big picture. When this is done, I want to change the ImageSource to the new picture. Here is my example:
private BitmapImage picture;
public BitmapImage Picture
{
get
{
if (picture == null)
{
RequestBigpicture();
return Thumbnail;
}
return picture;
}
}
public void RequestBigpicture()
{
picture = new BitmapImage(new Uri("http://www.fun-hollywood.de/" + bigPicture, UriKind.Absolute));
picture.ImageOpened += pictureImage_ImageOpened;
}
void pictureImage_ImageOpened(object sender, System.Windows.RoutedEventArgs e)
{
NotifyPropertyChanged("Picture");
}
This was not working, also this part (as I read somewhere) in RequestBitPicture is not better:
picture = new BitmapImage(new Uri("http://www.fun-hollywood.de/" + bigPicture, UriKind.Absolute));
var pictureImage = new Image();
pictureImage.Source = picture;
pictureImage.ImageOpened += pictureImage_ImageOpened;
The ImageOpened is never called. How would be the best way to do this?
I think you should set the BitmapImage.CreateOptions property to None or to BackgroundCreation to instantly trigger the image download.
Because the default value is DelayCreation that is why your image won't donwloaded and the ImageOpened event is never fired.

Categories