Image.FromFile(@"path\filename.tif")
Run Code Online (Sandbox Code Playgroud)
要么
Image.FromStream(memoryStream)
Run Code Online (Sandbox Code Playgroud)
即使源是多帧TIFF文件,两者都只生成一帧的图像对象.如何加载保留这些帧的图像文件?逐帧使用Image.SaveAdd方法保存tiff.它们在其他查看器中工作,但.NET Image方法不会加载这些帧,只有第一个.
这是否意味着无法从我传入位图集合的方法返回多帧TIFF以用作帧?
在使用Graphics.DrawString时,是否可以以某种方式控制字母间距?我找不到允许我这样做的DrawString或Font的任何重载.
g.DrawString("MyString",
new Font("Courier", 44, GraphicsUnit.Pixel),
Brushes.Black,
new PointF(262, 638));
Run Code Online (Sandbox Code Playgroud)
字母间距我指的是字母之间的距离.如果我添加了足够的空间,那么间距MyString可能看起来很像.
谁能解释为什么在.NET框架中有PointF结构(使用单精度float类型)而没有"PointD"(使用双精度double类型)?
他们是否确定在System.Drawing命名空间中这样的精度永远不会有意义?还有其他原因吗?
我有以下代码.有没有一种简单的方法来概述我正在写的文字?
var imageEncoder = Encoder.Quality;
var imageEncoderParameters = new EncoderParameters(1);
imageEncoderParameters.Param[0] = new EncoderParameter(imageEncoder, 100L);
var productImage = GetImageFromByteArray(myViewModel.ProductImage.DatabaseFile.FileContents);
var graphics = Graphics.FromImage(productImage);
var font = new Font("Segoe Script", 24);
var brush = Brushes.Orange;
var container = new Rectangle(myViewModel.ContainerX, myViewModel.ContainerY, myViewModel.ContainerWidth, myViewModel.ContainerHeight);
var stringFormat = new StringFormat {Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center};
graphics.DrawString(customizationText, font, brush, container, stringFormat);
Run Code Online (Sandbox Code Playgroud) 当重写自定义控件的OnPaint方法时,我提供了一个PaintEventArgs,它包含一个Graphics对象和一个ClipRectangle.ClipRectangle对我的口味来说太小了,所以我想要将它扩展为100像素,或者完全忽略它.
无论我做什么,我似乎都无法突破ClipRectangle.到目前为止,我已经尝试过:
e.ClipRectangle.Inflate(100, 0);
e.Graphics.ResetClip();
e.Graphics.SetClip(new Rectangle(x, y, w, h));
Run Code Online (Sandbox Code Playgroud)
父控件调用Invalidate(true)(强制所有子控件的子控件失效).
我也做了一些谷歌搜索,看着鲍勃鲍威尔的网站,但找不到核武器.
ResetClip将Graphics对象的剪切区域重置为无限大的Rectangle,但Graphics对象高兴地继续使用提供的ClipRectangle.
救命.
在下面的代码中,我试图绘制两条线:一条具有子像素宽度(0.5),另一条具有1px宽度:
var img = new Bitmap(256, 256);
Graphics graphics = Graphics.FromImage(img);
graphics.SmoothingMode = SmoothingMode.AntiAlias;
// Draw a subpixel line (0.5 width)
graphics.DrawLine(new Pen(Color.Red, (float)0.5), 0, 100, 255, 110);
// Draw a single pixel line (1 width)
graphics.DrawLine(new Pen(Color.Red, (float)1), 0, 110, 255, 120);
img.Save(@"c:\temp\test.png", ImageFormat.Png);
graphics.Dispose();
img.Dispose();
Run Code Online (Sandbox Code Playgroud)
但是,在生成的图像中,两条线显示相同的宽度:

有没有办法让顶线出现亚像素(0.5px)?
我想在bmp图像上绘制一条线,该线在C#中使用drawline方法传递给方法
public void DrawLineInt(Bitmap bmp)
{
Pen blackPen = new Pen(Color.Black, 3);
int x1 = 100;
int y1 = 100;
int x2 = 500;
int y2 = 100;
// Draw line to screen.
e.Graphics.DrawLine(blackPen, x1, y1, x2, y2);
}
Run Code Online (Sandbox Code Playgroud)
这给了一个错误.所以我想知道如何在这里包含paint事件(PaintEventArgs e)
并且还想知道在调用drawmethod时如何传递参数?例
DrawLineInt(Bitmap bmp);
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误"当前上下文中不存在名称'e'"
我画了以下网格:
使用以下两种方法绘制上述网格,一种用于计算网格,另一种用于计算每个单元格的中心:
//makes grid in picture box
private void drawGrid(int numOfCells, int cellSize, Graphics gr)
{
Pen p = new Pen(Color.SteelBlue);
for (int i = 0; i < Math.Sqrt(numOfCells) + 1; i++)
{
// Vertical
gr.DrawLine(p, i * cellSize + 300, 200, i * cellSize + 300, 700);
// Horizontal
gr.DrawLine(p, 300, i * cellSize+200, 800, i * cellSize+200);
}
this.topology.SendToBack();
}
//draw the center point for each cell of the grid
private void drawCenters(Graphics gr)
{
for (int j …Run Code Online (Sandbox Code Playgroud) 我理解最好在Pen和Brush实例上调用Dispose(),除非它们已经设置为系统预定义值(例如System.Drawing.Brushes, System.Drawing.Pens或System.Drawing). SystemBrushes)
尝试处置系统定义的资源会导致抛出异常.
除了在try/catch中包装Dispose()调用之外,这些资源中的一个是否引用了系统定义的值或用户定义的值,这似乎并不明显.
因此,在发现Bitmap类期望原始流在图像或位图的生命周期内保持打开之后,我决定找出Bitmap类在处理时是否实际关闭了流.
查看源代码,Bitmap和Image类创建一个GPStream实例来包装流,但不存储对GPStream或Stream实例的引用.
num = SafeNativeMethods.Gdip.GdipLoadImageFromStreamICM(new GPStream(stream), out zero);
Run Code Online (Sandbox Code Playgroud)
现在,GPStream类(内部)没有实现Release或Dispose方法 - 什么都不允许GDI关闭或处理流.由于Image/Bitmap类没有保留对GPStream实例的引用,因此GDI,Drawing.Bitmap或Drawing.Stream似乎无法正确关闭流.
我可以继承Bitmap来解决这个问题,但是,等等,它是密封的.
请告诉我,我错了,并且MS不仅无法编写不会泄漏API资源的代码.
system.drawing ×10
c# ×8
.net ×3
graphics ×3
gdi+ ×2
winforms ×2
double ×1
drawing2d ×1
idisposable ×1
memory-leaks ×1
tiff ×1