|
You're going to have some problems with the method you're using if you want to save it.
The best thing that I can suggest to do is to create an intermediate Bitmap to draw on and set your PictureBox1.Image value to that Bitmap. Then, you can save it pretty easily. For example:
Rectangle rect = New Rectangle(0,0,0,0);
Bitmap myBitmap;
private void PictureBox_MouseDown(object sender, MouseEventArgs e)
{
if (myBitmap == null)
{
myBitmap = New Bitmap(PictureBox1.Width, PictureBox1.Height, PictureBox1.CreateGraphics());
PictureBox1.Image = myBitmap;
}
rect = New Rectangle(e.X, e.Y, 0, 0);
PictureBox1.Invalidate();
}
private void PictureBox_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
rect = New Rectangle(rect.Left, rect.Top, e.X - rect.Left, e.Y - rect.Top);
PictureBox1.Invalidate();
}
}
private void PictureBox_Paint(object sender, PaintEventArgs e)
{
if (myBitmap == null) { return; }
using (Pen pen = New Pen(Color.Red, 2))
{
using (Graphics g = Graphics.FromImage(myBitmap))
{
g.Clear(Color.White);
g.DrawRectangle(pen, rect);
}
}
}
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
if (myBitmap != null)
{
myBitmap.Save("D:\\Temp\\Bitmapsave.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
}
}
It's basically the same thing you've done, except instead of drawing on the bitmap instead of directly on the PaintBox.
|
|
|
|
|
Hi,
Thanks for replay. I tried the code and still I get "out of memory" error when i try to open the saved image.
error at
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
....
.....
pictureBox1.Image = Image.FromFile(file); (this line shows as out of Memory)
..........
}
in the code, pre-defined the location to save. but I am giving it in run time. is this causing error.
is the image needs to saved in temp. i saved the image in mydocument\mypicture\. I went to the saved location and the saved image shows as no preview available.
is there is any change needs to be done in Open toolstripmenu.
Thanks
|
|
|
|
|
You're not understanding what you are actually doing and how that isn't what you are trying to do.
First, let me try to explain what your Paint method is doing. When you use the Graphics provided by the Paint method and then draw rectangles and other objects over that, none of that gets saved in memory. The only thing that is happening is that it is drawing on the screen. So, when you go to save the image in the PictureBox, none of the user-made rectangles will be saved with it.
What you will need to do is have two different Bitmaps...one for the background image (the image loaded from file) and one for the user-drawn rectangles and such. Then, whenever you paint, first paint the rectangles to the user-drawn bitmap. Then, you can use the graphics provided by the paint to draw it.
Then, when you go to save, you have to draw the user-drawn bitmap over the background image.
Here's some pseudo-code and real code:
Image backgroundImage;
Bitmap userDraw;
Rectangle rect;
private void OpenMenuItem()
{
backgroundImage = new Image(file);
pictureBox1.Image = backgroundImage;
pictureBox1.Invalidate();
}
private void pictureBox_MouseDown()
{
if (userDraw == null)
{
userDraw = new Bitmap(pictureBox1.Width, pictureBox1.Height, pictureBox1.CreateGraphics());
}
rect = new Rectangle(e.X, e.Y, 0, 0);
pictureBox1.Invalidate();
}
private void pictureBox_MouseMove()
{
if (e.Button == MouseButtons.Left)
{
rect = new Rectangle(rect.Left, rect.Top, e.X - rect.Left, e.Y - rect.Top);
pictureBox1.Invalidate();
}
}
private void PictureBox_Paint(object sender, PaintEventArgs e)
{
if (myBitmap == null) { return; }
using (Pen pen = new Pen(Color.Red, 2))
{
using (Graphics g = Graphics.FromImage(myBitmap))
{
g.Clear(Color.Transparent);
g.DrawRectangle(pen, rect);
}
e.Graphics.DrawRectangle(pen, rect);
}
}
private void SaveMenuItem()
{
if (myBitmap != null)
{
using (Graphics g = Graphics.FromImage(BackgroundImage))
{
g.DrawImage(myBitmap, 0, 0);
}
BackgroundImage.Save("C:\\Temp\\Bitmapsave.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
}
}
The way that you are doing it, you won't actually get what you're expecting because you're not drawing the rectangles onto any surface that will keep it in memory.
As far as running out of memory, that is something else within your program. It means that you're probably doing other things and not disposing of the memory and therefore are running out. I've tested this and I have no problems when saving an image and then opening it.
|
|
|
|
|
I have rectified the problem. Problem lies in if condition in the save tooltip. if i remove the if condition and save the file it's works.
new code
Image bac;
Bitmap myBitmap;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (mybitmap == null)
{
mybitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height, pictureBox1.CreateGraphics());
}
rect = new Rectangle(e.X, e.Y, 0, 0);
this.Invalidate();
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
switch (e.Button)
{
case MouseButtons.Left:
{
rect = new Rectangle(rect.Left, rect.Top, e.X - rect.Left, e.Y - rect.Top);
this.Invalidate();
break;
}
}
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
if (mybitmap == null)
{
return;
}
using (Pen pen = new Pen(Color.Red, 2))
{
using (Graphics g = Graphics.FromImage(mybitmap))
{
e.Graphics.DrawRectangle(pen, rect);
if (label1.TextAlign == ContentAlignment.TopLeft)
{
e.Graphics.DrawString(label1.Text, label1.Font, new SolidBrush(label1.ForeColor), label1.Bounds);
g.DrawString(label1.Text, label1.Font, new SolidBrush(label1.ForeColor), label1.Bounds);
mybitmap.PixelFormat);
}
else if (label1.TextAlign == ContentAlignment.TopCenter)
{
SizeF size = e.Graphics.MeasureString(label1.Text, label1.Font);
float left = ((float)this.Width + label1.Left) / 2 - size.Width / 2;
RectangleF rect1 = new RectangleF(left, (float)label1.Top, size.Width, label1.Height);
e.Graphics.DrawString(label1.Text, label1.Font, new SolidBrush(label1.ForeColor), rect1);
}
else
{
SizeF size = e.Graphics.MeasureString(label1.Text, label1.Font);
float left = (float)label1.Width - size.Width + label1.Left;
RectangleF rect1 = new RectangleF(left, (float)label1.Top, size.Width, label1.Height);
e.Graphics.DrawString(label1.Text, label1.Font, new SolidBrush(label1.ForeColor), rect1);
}
}
}
}
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
if (mybitmap != null)
{
SaveFileDialog SaveFD1 = new SaveFileDialog();
SaveFD1.FileName = "";
SaveFD1.InitialDirectory = "C";
SaveFD1.Title = "save file Name";
SaveFD1.Filter = "JPG|*.jpg|Bmp|*.bmp";
if (SaveFD1.ShowDialog() == DialogResult.OK)
{
System.IO.Stream filename = (System.IO.FileStream)SaveFD1.OpenFile();
int r = SaveFD1.FileName.Length;
for (int r1 = 0; r1<=r;)
{
if (SaveFD1.FileName[r1] != '.')
r1++;
else
{
r = r1;
break;
}
}
if (SaveFD1.FileName[++r] == 'j')
{
using (Graphics g = Graphics.FromImage(bac))
{
g.DrawImage(mybitmap, 0, 0);
}
bac.Save(filename, ImageFormat.Jpeg);
}
else if (SaveFD1.FileName[r] == 'b')
{
using (Graphics g = Graphics.FromImage(bac))
{
g.DrawImage(mybitmap, 0, 0);
}
bac.Save(filename, ImageFormat.Jpeg);
}
else
{
using (Graphics g = Graphics.FromImage(bac))
{
g.DrawImage(mybitmap, 0, 0);
}
bac.Save(filename, ImageFormat.Png);
}
filename.Close();
}
}
}
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFD.FileName = "";
OpenFD.Title = "open image";
OpenFD.InitialDirectory = "C";
OpenFD.Filter = "JPEG|*.jpg|Bmp|*.bmp|All Files|*.*.*";
if (OpenFD.ShowDialog() == DialogResult.OK)
{
file = OpenFD.FileName;
bac = Image.FromFile(file);
pictureBox1.Image = bac;
pictureBox1.Invalidate();
}
}
Now the above code works as expected.
Now can i clear the previous work done.
Ex: I have drawn the rectangle but i don't want this so i am drawing new rectangle (note: the above code will make invisible the previous rectangle when new rectangle been drawn) and saved the file. when i open the saved file its show all the rectangle drawn.
How can i clear the previous work (drawn)?
Thanks
|
|
|
|
|
sorry, have disabled this (g.Clear(Color.Transparent);) functions.
Thanks "William Winner" for guiding me....
modified on Friday, May 21, 2010 3:00 AM
|
|
|
|
|
How can I make my service to start certain application, so user'll be able to use it?
|
|
|
|
|
Process.Start can start applications. But a service starting applications doesn't looks good. Services are not meant for this.
Best wishes,
Navaneeth
|
|
|
|
|
unfortunately if I use Process.Start applications run without any interface
|
|
|
|
|
If I'm not mistaken, and I could be, you have to check the "Allow service to interact with desktop" option under the "Log On" tab of the service properties.
|
|
|
|
|
Sure, but I'd like to start applications on the users desktop
|
|
|
|
|
Services run under a non-visible desktop. What you want to do shouldn't be done at all. The "Allow the service to interact with Desktop..." option is for the service to put up a small user interface, like notifications or options dialogs. It is NOT going to allow the service to launch an application on the users Desktop. Any process launched by the service will inherit the session and desktop of the process that launched it, i.e.: your service.
There's just about never a good reason to do this and I suspect you're approaching your design all wrong.
For instance, what happens when your service needs to launch the UI app and there's noone logged in?
|
|
|
|
|
A windows service should not be used to start applications for users. However, if yu really want to do this, the service should wait for a user to log in, and then launch the app. You'll have to turn on "Interacts with desktop" in the service.
.45 ACP - because shooting twice is just silly ----- "Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "The staggering layers of obscenity in your statement make it a work of art on so many levels." - J. Jystad, 2001
|
|
|
|
|
That is not a good idea -- rethink the problem.
|
|
|
|
|
Thank you all! I realize that it was bad idea and switch to autorun application without UI.
|
|
|
|
|
Is there any way that i can make clone of hard drive c to mu external one by using c# code?
can anyone help me with guideline or opensource software which has the desirable method.
|
|
|
|
|
Ummm, maybe a something like, File.Copy ?
I know the language. I've read a book. - _Madmatt
|
|
|
|
|
I wouldn't attempt it with managed code.
|
|
|
|
|
I'm asking how to do it not should I do it.
can anyone please provide me with any clue
|
|
|
|
|
Beside using File.Copy (as mentioned) use methods like Directory.GetDirectories and Directory.GetFiles . Maybe recursive programming will help you out as well..
|
|
|
|
|
But if no one thinks you should, no one will tell you how.
|
|
|
|
|
You can try xcopy-tool./[^]
Thanks
Md. Marufuzzaman
I will not say I have failed 1000 times; I will say that I have discovered 1000 ways that can cause failure – Thomas Edison.
|
|
|
|
|
Clonning a partition is not an easy task, and by far an easy one to do with managed code.
If you want to do a full clone then your aim is to understand partition descriptors, file and folder descriptors and all the stuff that goes behind a file system when it acceses a partition. Why it is necessary to understand them, simple you can't just rely on the file system of an os and there are lots of existing partition types.
If you want just to copy all the files from a partition to another you must keep in mind that critical files opened by the operating system and/or applications are not readeable (nor writable) unless they are closed (or opened under special conditions).
ps: partition != hard drive
I have no smart signature yet...
|
|
|
|
|
You're not going to do it in managed code. In the simplest form you can do this, it requires that Windows isn't running since there will be plenty of areas of the disk that will be locked and unavailable to even be read.
I wrote an app to do this way back in 1991, written in C and running from a DOS boot floppy. I was duplicating hard drives for the mass production of "laptop" computers for Prudential Insurance. Every machine has a standard DOS/Windows/software load that had to be on about 450 machines.
For those keeping score, Ghost came out 2 years later in 1993. Yeah, there's my moment! ...had I only known there was a market...
|
|
|
|
|
I have a treeview where many treenodes belonging to different parent nodes may represent the same object, so if a user updates a text for such node, it should also trigger an update of text for all other nodes representing the same object. For instance if I have nodes representing school classes (math, english...) each class node has student nodes with student name as text, so numerous classes can contain the nodes with same student name. If I change students name under one parent, it should update it under the rest. I would assign the student object to nodes tag, but how would I trigger a text update?
thanks
|
|
|
|
|
There are a number of ways.
Ideally, the student class has a ToString or similar method that is used to format the text for the node.
Then you can enumerate the nodes, updating the text. You can probably make that quicker by checking to see if it's the updated record. And you should probably do that on a thread.
|
|
|
|
|