Winforms System.Windows.Forms.Control类有一个实例方法"DrawToBitmap",我认为它在各种情况下都非常有用.我想知道是否有一种从WPF应用程序获取System.Drawing.Bitmap的等效方法?
我意识到我可以做一些P/Invoke的东西来获取应用程序窗口,但是我不喜欢这个,因为它不能很好地适应64位转换,并且不允许我只渲染子控件,如DrawToBitmap确实.
谢谢,理查德
最好使用一个Graphics对象,如何绘制一个字符串,使字符仍然正常,但是垂直堆叠?
我正在尝试在asp.net中重新调整上传的jpeg
所以我去:
Image original = Image.FromStream(myPostedFile.InputStream);
int w=original.Width, h=original.Height;
using(Graphics g = Graphics.FromImage(original))
{
g.ScaleTransform(0.5f, 0.5f); ... // e.g.
using (Bitmap done = new Bitmap(w, h, g))
{
done.Save( Server.MapPath(saveas), ImageFormat.Jpeg );
//saves blank black, though with correct width and height
}
}
Run Code Online (Sandbox Code Playgroud)
这节省了处女黑色jpeg我给它的任何文件.虽然如果我将输入图像流立即带入done位图,它会重新压缩并保存它,如:
Image original = Image.FromStream(myPostedFile.InputStream);
using (Bitmap done = new Bitmap(original))
{
done.Save( Server.MapPath(saveas), ImageFormat.Jpeg );
}
Run Code Online (Sandbox Code Playgroud)
我必须用g制作一些魔法吗?
upd:我试过了:
Image original = Image.FromStream(fstream);
int w=original.Width, h=original.Height;
using(Bitmap b = new Bitmap(original)) //also tried new Bitmap(w,h) …Run Code Online (Sandbox Code Playgroud) 我看到了几个问题,询问如何从图像中读取元数据,但我没有看到很多人询问如何编写元数据.基本上,我需要将一个元数据项("ImageDescription")添加到我正在动态生成的PNG图像中(创建一个Bitmap对象并在程序上生成其中的所有内容).
在将文件写入磁盘之前或之后,使用.NET向图像添加元数据的最佳方法是什么?
我需要缩小高度或宽度大于预定义像素值的图像.
我编写了一些代码来查看原始图像,检查宽度,高度或高度和宽度是否大于最大宽度/最大高度设置.
我现在需要根据后一个值的最大值找出要调整大小的尺寸.
例如:如果图像是900h x 300w和MAX高度是700h我需要调整高度700和宽度????< - 这是我需要计算的..
创建和保存图像文件很简单,超出了本文的范围:
// First I get the max height and width allowed:
int resizeMaxHeight = int.Parse(Utility.GetConfigValue("ResizeMaxHeight")); // in config: 700px
int resizeMaxWidth = int.Parse(Utility.GetConfigValue("ResizeMaxWidth")); // in config: 500px
// Save original:
try
{
filebase.SaveAs(savedFileName);
}
catch (System.IO.DirectoryNotFoundException ex)
{
Logger.Instance.LogException(ex, 0, "FileTransfer");
}
// Determin original dimensions:
Image image = System.Drawing.Image.FromFile(Server.MapPath(savedFileName));
int resizeHeight, resizeWidth;
bool doResize = true;
// both height and width are greater …Run Code Online (Sandbox Code Playgroud) c# system.drawing image-manipulation bitmap image-processing
我在一个System.Drawing.Graphics物体上画文字.我正在使用该DrawString方法,使用文本字符串,a Font,a Brush,a bounding RectangleF和a StringFormat参数.
调查一下StringFormat,我发现我可以将它的Alignment属性设置为Near,Center或Far.但是我还没有找到将它设置为Justified的方法.我怎样才能做到这一点?
谢谢您的帮助!
我创造了一个Label,有时我正在使用.DrawToBitmap().我不知道为什么,但在我运行我的程序一段时间后(.DrawToBitmap()经常调用)我得到了异常:
System.ArgumentException: Parameter is not valid.
at System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format)
at System.Drawing.Bitmap..ctor(Int32 width, Int32 height)
Run Code Online (Sandbox Code Playgroud)
不知怎的,我不能经常调用这个函数.如果我从根本上尝试这个:
while(true)
{
System.Windows.Forms.Label label = new Label();
label.Font = new Font("Arial", 20);
label.Text = "test";
try
{
Bitmap image = new Bitmap(300, 500);
label.DrawToBitmap(image, label.ClientRectangle);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
Run Code Online (Sandbox Code Playgroud)
我得到了5-6秒(1000-2000个电话)的异常.问题是什么?怎么避免这个?
编辑:谢谢你们的想法Dispose()- 不知何故,如果我使用它,一切都很完美label.即使我不在Bitmap上使用它也没关系.这两个答案都很棒,我只能接受其中一个:(
using System.Drawing;
using System.Drawing.Drawing2D;
namespace WindowsFormsApplication1
{
[Serializable]
public class GMapBaloonTool: GMapToolTip, ISerializable
{
public float Radius = 10f;
public GMapBaloonTool(GMapMarker marker)
: base(marker)
{
Stroke = new Pen(Color.FromArgb(140, Color.Navy));
Stroke.Width = 3;
this.Stroke.LineJoin = LineJoin.Round;
this.Stroke.StartCap = LineCap.RoundAnchor;
Fill = Brushes.Pink;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码,使工具提示改变其颜色.

我正在使用gMaps.net在winforms C#中创建自定义谷歌地图.我正在努力添加一个标记+ onClick事件,它将显示来自DVR的视频输入.
唯一的问题是,内置的GMapsToolTip只显示字符串,虽然我有一个activeX作为摄像头的控件.
我需要的是在工具提示中显示相机(activeX).在伟大的地图上的论坛上
看到这个.创作者说我可以制作自定义工具提示.
所以我要问的是,是否可以使用此system.drawing命名空间创建/添加控件?
如果可能的话,请告诉我如何......
如果不知道,如果你知道其他任何方式,请告诉我.
public override void OnRender(Graphics g)
{
System.Drawing.Size st = g.MeasureString(Marker.ToolTipText, Font).ToSize();
System.Drawing.Rectangle rect = new System.Drawing.Rectangle(Marker.ToolTipPosition.X, Marker.ToolTipPosition.Y - st.Height, st.Width + …Run Code Online (Sandbox Code Playgroud) 我正在开发一个辅助技术应用程序(在C#中),它将信息叠加在当前打开的窗口之上.它检测可点击的元素,并标记它们.
为此,我正在创建一个无边框透明窗口,TopMost设置为"true",并在其上绘制标签.这意味着在当前应用程序前面总会有一个窗口悬停,我可以在其上绘制标签.
问题是,这个窗口不包括右键菜单 - 只包括其他窗口.当用户右键单击时,将在叠加层上方绘制上下文菜单.
我需要能够在右键单击菜单中标记元素,但我无法在当前实现的基础上绘制它.有人知道解决方案吗?
编辑:这是绘制叠加层的相关代码.我在表单设计器中设置了表单选项,而不是代码明确,所以我不确定它会有多大帮助.我删除了与绘图无关的代码或表单本身:
public partial class OverlayForm : Form
{
public OverlayForm()
{
}
protected override void OnPaint(PaintEventArgs eventArgs)
{
base.OnPaint(eventArgs);
Graphics graphics = eventArgs.Graphics;
Brush brush = new SolidBrush(this.labelColor);
foreach (ClickableElement element in this.elements)
{
Region currentRegion = element.region;
graphics.FillRegion(brush, currentRegion);
}
}
}
Run Code Online (Sandbox Code Playgroud) 这样做时,为什么线路等不会被消除锯齿?
using (var myGraphics = Graphics.FromImage(bitmap))
{
myGraphics.CompositingQuality = CompositingQuality.HighQuality;
myGraphics.SmoothingMode = SmoothingMode.HighQuality;
myGraphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
myGraphics.Clear(backgroundColor);
myGraphics.EnumerateMetafile(m_metafile, new Point(0, 0), m_metafileDelegate);
}
Run Code Online (Sandbox Code Playgroud)
委托函数如下所示:
private bool MetafileCallback(EmfPlusRecordType recordType, int flags, int dataSize, IntPtr data, PlayRecordCallback callbackData)
{
byte[] dataArray = null;
if (data != IntPtr.Zero)
{
// Copy the unmanaged record to a managed byte buffer
// that can be used by PlayRecord.
dataArray = new byte[dataSize];
Marshal.Copy(data, dataArray, 0, dataSize);
}
m_metafile.PlayRecord(recordType, flags, dataSize, dataArray);
return true;
}
Run Code Online (Sandbox Code Playgroud)
我是否需要覆盖特定类型的PlayRecord以获得抗锯齿功能? …