Layering transparent images and text on top of each other? - c#

I'm still pretty new to Visual Studio. I have a few transparent images that I want to later on top of each other so that they appear as one image when put together. On top of that, I'm using DrawString to draw text on top of the images. I've been using DrawImage to display the images into a PictureBox, but I can't seem to get them to all display at once.
Edit: Here's some of the code I've been using.
private void drawTextBox()
{
var image = new Bitmap(this.pictureBox_TextBox.Width, this.pictureBox_TextBox.Height);
var graphics = Graphics.FromImage(image);
graphics.DrawImage(new Bitmap(#"C:\Users\Home\Documents\Visual Studio 2013\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Resources\TextBox.png"), new Point(0, 151));
this.pictureBox_TextBox.Image = image;
}

Related

Custom bitmap capture that keeps formatting?

I have been using Bitmap to take a capture of my main form and saving it as jpeg. Unfortunately bitmap does not keep my text colour. Best way I can describe this is by images (see below). My mainform has an objectlistview which has a column coloured red. Bitmap however captures this as black text? why?
Is there any other alternative method I can use?
I have tried capturing screen and cutting out the the mainform as shown in the code below. This works great on a 1080p monitor, but not on my 4k monitor with 200% scaling, it results in the image being cut.
public void SaveControlImage(Form form)
{
string path_and_file = "C:\1.png";
Bitmap controlBitMap = new Bitmap(form.Width, form.Height);
Graphics g = Graphics.FromImage(controlBitMap);
g.CopyFromScreen(PointToScreen(form.Location), new Point(0, 0), form.Size);
// example of saving to the desktop
controlBitMap.Save(path_and_file, System.Drawing.Imaging.ImageFormat.Png);
}

Webcam image differ from printed image

I am busy with a C# winform software. I use webcam to take a picture which display in a pictureBox.
When I capture the image with the webcam, it captures a zoomed image, and when printing, it is a stretched image. I have tried a variety of SizeMode settings.All give the same result
Because I am not sure where the fault is, I will include as much detail as possible:
Using
using AForge.Video;
using AForge.Video.DirectShow;
Selecting Camera:
webcam = new FilterInfoCollection(FilterCategory.VideoInputDevice);
foreach (FilterInfo VideoCaptureDevice in webcam)
{
cmbVideoList.Items.Add(VideoCaptureDevice.Name);
}
Using camera (btn click):
cam = new VideoCaptureDevice(webcam[cmbVideoList.SelectedIndex].MonikerString);
cam.NewFrame += new NewFrameEventHandler(cam_NewFrame);
cam.Start();
if (cam.IsRunning)
{
btnStart.Hide();
}
btnStop.Show();
}
void cam_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
Bitmap bit = (Bitmap)eventArgs.Frame.Clone();
pboxPhoto.Image = bit;
}
PictureBox size:
Width: 226
Height: 328
Printing code:
PictureBox pict = (PictureBox)pboxPhoto;
pict.SizeMode = PictureBoxSizeMode.Zoom;
e.Graphics.DrawImage(pict.Image, 20, 416, 305, 328);
Here is a sample of the image on software:
enter image description here
Sample of printed image.
enter image description here
The simplest way is to tell the PictureBox to draw itself to a Bitmap.
This can be done with all Controls and the result will include not just the Image and maybe BackgroundImage but also anything drawn in the Paint event as well as any nested Controls.
Here is a simple example:
Size sz = pictureBox1.ClientSize;
using (Bitmap bmp = new Bitmap(sz.Width, sz.Height))
{
pictureBox1.DrawToBitmap(bmp, pictureBox1.ClientRectangle);
// save the image..
bmp.Save(yourfilepath, ImageFormat.Png);
// ..or print it!
}
A few notes:
Due to the using clause the Bitmap get disposed after the last curly, so you would either make use of it inside scope or change to a pattern that disposes of the Bitmap at a later point in time.
The nested Controls will be drawn a reverse order which will cause problem if they are overlapping!
Only nested, not overlayed Controls will be included. Since PictureBox is not a Container (as opposed to e.g. a Panel) it won't do to simply placea, say Label, over it; instead you need to nest it in code, i.e. make the PictureBox its Parent and also set a suitable relative Location..
By default the Bitmap will have the current machine's screen dpi resolution. You cold change it afterwards with bmp.SetResolution()..

c# use emgu imagebox control to display a image

I use the imagebox to display a image(imgWidth:19200, imgHeight:260),and my code is:
imageBox = new ImageBox();
imageBox.Size = new Size(imgWidth, imgHeight);
imageBox.Dock = DockStyle.Fill;
MainSplitContainer.Panel1.Controls.Add(imageBox);
imageBox.Image = new Image<Bgr, byte>("2.bmp");
But the displayed image width is only about 15000, and the right part of the image can not be displayed. How can I display the full image?
It is possible that an ImageBox won't do more than 15,000 pixels in width. However, have you tried setting the functional mode to Pan and Zoom? Maybe that will get you there.
Doug

C# Layering transparent images

I'm fairly new to working with c#, so I am sure there is a way to accompish this, but I have been unable to find an answer that works.
I am making a simple game where you create a pizza (similar to dominoes interactive ordering system). The user selects the toppings from a list and they appear on the pizza image. I planned to simply change the visibility of the topping .pngs when the items are selected, however, the last .png to appear covers up all previous ones.
I have tried using picture boxes and panels.
When using picture boxes, only the top visible image shows. I have the .pngs backgrounds set to transparent, and while they do show the form's background color, they mask the other .pngs.
When I used the panels, I had problems with the upper images parenting with the lower ones, so if I changed the visibility of the bottom one, all ones above it were hid as well.
I appreciate any help and advice.
Mix images at runtime and add it to your picturebox:
Bitmap bmp = (Bitmap)Bitmap.FromFile("pizza.png"); //or get it from any other source
Bitmap bmp2 = (Bitmap)Bitmap.FromFile("over.png"); //or get it from any other source
Bitmap bmpdest = new Bitmap(bmp.Width, bmp.Height);
Graphics g = Graphics.FromImage(bmpdest);
g.DrawImage(bmp, new Point(0, 0));
g.DrawImage(bmp2, new Point(0, 0));
PictureBox1.Image = (Image)bmpdest;

Overlay of two images - Control which part is in the foreground with mouse coursor

I need to be able to compare two different Images in the following way:
The images are displayed on top of each other so first there is only one image visible. When hovering with the mouse coursor over the image this defines the X-position of a vertical line which is splitting the image, displaying part of the first image left to the line and the rest of the second image right to the line.
This basically should be used as a quality comparison for two images with identical contents.
Here is a picture that hopefully makes my intentions clear:
you can use splitter control. splitter one side you put one picture control another side put other picture control
I was able to resolve this by using a SplitContainer and custom drawing. As described in the comment of Vasanthakumar's answer purely using a picturebox is not enough as you will not be able to align the right image at the same starting point than the left image (top left of the form).
What I did was the following:
pictureBox 1 displays its image normally
the Image in pictureBox 2 is drawn on every move of the splitter (this.splitContainer1.SplitterMoved += new System.Windows.Forms.SplitterEventHandler(this.splitContainer1_SplitterMoved); with a custom subset of the Image to be displayed.
This effectively allows to generate the overlay I need.
Part of my implementation showing the drawing logic:
Bitmap bmp = new Bitmap(gImg2.Width, gImg2.Height);
using (Graphics g = Graphics.FromImage(bmp))
{
g.DrawImage(gImg2, 0, 0, new Rectangle(e.SplitX, 0, gImg2.Width - e.SplitX, gImg2.Height), GraphicsUnit.Pixel);
}
pictureBox2.Image = bmp;

Categories