I have a page in my MVC4 project where user can add its company logo using the file upload control. These images/logos are then shown on map in mobile application. We need to crop these images so that they can look like a Flag.
We need to take only the part of image inside the flag frame and leave the rest.
Can it be done using code in C#?
If yes, how it can be done. Please help me with some code samples and links.
I need to show a flag frame over the uploaded image, so that user can adjust its image in that frame, what it wants to be in the frame.
Please suggest me with some APIs and code samples.
Thanks.
Update: In some sites, when we upload profile image, it gives us a frame on top, and the image we have selected can be moved, so that the desired part comes into that frame. Now when we upload our profile image, it gets resized into that size. Can I do something similar here? in the frame above, I can give a flag shape, user can move the uploaded image, to get desired part of image in that frame.
Is it right approach?
How can we do this? I have looked into some jquery code samples, but no help.
You can use SetClip function with the Region as parameter:
https://msdn.microsoft.com/en-us/library/x1zb278e(v=vs.110).aspx
So you need to create Graphics object from Bitmap, set clip with the shape of your flag and then draw image on that Graphics object. That's all.
// Following code derives a cutout bitmap using a
// scizzor path as a clipping region (like Paint would do)
// Result bitmap has a minimal suitable size, pixels outside
// the clipping path will be white.
public static Bitmap ApplyScizzors(Bitmap bmpSource, List<PointF> pScizzor)
{
GraphicsPath graphicsPath = new GraphicsPath(); // specified Graphicspath
graphicsPath.AddPolygon(pScizzor.ToArray()); // add the Polygon
var rectCutout = graphicsPath.GetBounds(); // find rectangular range
Matrix m = new Matrix();
m.Translate(-rectCutout.Left, -rectCutout.Top); // translate clip to (0,0)
graphicsPath.Transform(m);
Bitmap bmpCutout = new Bitmap((int)(rectCutout.Width), (int)(rectCutout.Height)); // target
Graphics graphicsCutout = Graphics.FromImage(bmpCutout);
graphicsCutout.Clip = new Region(graphicsPath);
graphicsCutout.DrawImage(bmpSource, (int)(-rectCutout.Left), (int)(-rectCutout.Top)); // draw
graphicsPath.Dispose();
graphicsCutout.Dispose();
return bmpCutout;
}
Related
I want colored portion of image to be placed at center of bitmap image. I was not able to find Aforge filters which can achieve this. Can you please guide how to achieve this(there will be only one color loop every time, like attached image). I have used Aforge through out project, but if EmguCV (OpenCV) can achieve this, I am open to use it.
I am able to achieve this using Aforge library, will provide link, code and result picture below.
Aforge documentation
// create filter
ExtractBiggestBlob filter = new ExtractBiggestBlob( );
// apply the filter
Bitmap biggestBlobsImage = filter.Apply( image );
Because I have only one blob, used filter which can output biggest blob. Now the colored portion occupies total image and it's center, becomes center of image.
I'm able to fill a rectangle with an image and i apply a mask on top of the image using this code
args.DrawingSession.FillRectangle(rect, imgRnd, mask);
i need to apply some transform to this image, i'am able to do that with no issue, but i have encounter a strange issue, the last pixel is repeated.
i have used
imgRnd.ExtendX = CanvasEdgeBehavior.Wrap;
imgRnd.ExtendY = CanvasEdgeBehavior.Wrap;
and the image is repeated continuously.
My question is : there is a way to draw one time the image disabling and ExtendX and ExtendY?
FillRectangle will always fill all the pixels within the specified rectangle. The edge behavior enum controls what value they are filled with if the image is positioned such that it does not completely cover the rectangle being drawn.
How exactly are you transforming the image? Can you change that to also transform the rectangle itself, so you won't be trying to fill pixels that aren't covered by the image?
Another option is to use image effects (Microsoft.Graphics.Canvas.Effects namespace) which give much more detailed control than FillRectangle over how multiple images are transformed, combined, etc.
I am currently working on a C# application that aims to do some computation and output graphs in a pdf file.
I use the Zedgraph library to draw my graphs so something like graphPane.AddCurve(PointPairList). Now I tried to output these graphs to pdf file via MigraDoc package.
Currently, I have a script that map the Zedgraph to bitmap then paste it on the pdf file. So something like this:
private Bitmap getBitMap()
{
ZedGraphControl graph = new ZedGraphControl();
newGraph = graphPane.Clone();
SizeF s = new SizeF(3.5f, 4.5f);
newGraph.Scale(s);
newGraph.DrawToBitmap(bit, new Rectangle(0, 0, newGraph.Width, newGraph.Height));
return bit;
}
The problem is that this give me a slightly pixellated image on the pdf page. And I need this graph to be in a very high quality. So are there anything I can change the improve the quality or do i have to change my entire approach for such thing.
Thank you so much in advance.
By default a Bitmap you create has your current screen resolution which could be as low as 75dpi, more common 96dpi; more modern monitors have 120dpi or more, but a good print quality starts 150dpi. For really crips images you want 300dpi and to allow zooming you may want to have 600dpi or more..
So you need to create and fill a bitmap with a larger size and take control of its dpi resolution.
Assuming your size of 3.5f x 4.5f is inches, for 300dpi you need a Bitmap with 1050 x 1350 pixels.
So you should create such a Bitmap..:
Bitmap bmp = new Bitmap(1050, 1350);
..and set the resolution:
bmp.SetResolution(300, 300);
To fill it up your control must have the same size:
newGraph.ClientSize = bmp.Size;
Now DrawToBitmap should create an image that is crisp and fit to zoom in..
Note that it does not matter if the control is too large to fit on the screen; DrawToBitmap will still work.
Update In addidtion to a sufficient resolution it is of interest to draw quality lines etc.. A speciality of ZedGraph is that one can turn on Antialiasing, either for individual lines:
curve_x.Line.IsAntiAlias = true;
or other elements:
myPane.XAxis.Scale.FontSpec.IsAntiAlias = true;
or the whole Chart:
zedGraphControl1.IsAntiAlias = true;
All examples are taken from this post.
I want to get the colors of the center bottom part of a BMP image. How this can be done, I need some techniques.
Check out the Bitmap class. It has a GetPixel() method which takes X/Y coordinates and returns the color of that pixel.
http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.getpixel%28v=VS.100%29.aspx
If this isn't enough, you'll have to describe more of what you are trying to accomplish.
I'm working on a Map Editor for an XNA game I'm designing in my free time. The pieces of art used in the map are stored on a single texture and rectangles are stored with coordinates and widths etc.
In the winforms application I can add segments by selecting the segment I want from a listbox, which is populated from the array of possible segments.
Problem is I would like to be able to show a preview of the segment selected and, since it is stored on a common texture, I cant simply set a picturebox to display the image.
Is there anyway of using the rectangle information (.x, .y, .width, .height) to display only the section of the image in a picturebox, or to blit the section to a bitmap and display that?
Many Thanks
Michael Allen
You probably want to look into the GDI library. Using the Image or Bitmap object and the Graphics.DrawImage() together will get what you're looking for.
private void DrawImageRectRect(PaintEventArgs e)
{
// Create image.
Image newImage = Image.FromFile("SampImag.jpg");
// Create rectangle for displaying image.
Rectangle destRect = new Rectangle(100, 100, 450, 150);
// Create rectangle for source image.
Rectangle srcRect = new Rectangle(50, 50, 150, 150);
GraphicsUnit units = GraphicsUnit.Pixel;
// Draw image to screen.
e.Graphics.DrawImage(newImage, destRect, srcRect, units);
}
You also might be interested in using XNA within your WinForm instead of using PictureBoxes and GDI. It's not 100% supported yet, but a tutorial on that can be found here.
You can use Graphics.DrawImage() and that will accept a Rectangle.