C# 保存图像时,在大位图上绘制的线不可见
我创建了一个程序,在选定的图像上绘制方形网格。它适用于分辨率较小的图像,但不适用于较大的图像 当图像保存为文件时,所有网格线都不可见。C# 保存图像时,在大位图上绘制的线不可见,c#,image,graphics,drawing,gdi+,C#,Image,Graphics,Drawing,Gdi+,我创建了一个程序,在选定的图像上绘制方形网格。它适用于分辨率较小的图像,但不适用于较大的图像 当图像保存为文件时,所有网格线都不可见。 我正在测试的图像具有分辨率3600x4320,可以在中显示 我如何解决这个问题 我的代码: Image drawGrid(int n, string imgPath) { Image img = Image.FromFile(imgPath); Graphics grp = Graphics.FromImage(img); grp.Smo
我正在测试的图像具有分辨率
3600x4320
,可以在中显示
我如何解决这个问题
我的代码:
Image drawGrid(int n, string imgPath)
{
Image img = Image.FromFile(imgPath);
Graphics grp = Graphics.FromImage(img);
grp.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
float m = img.Width * 1f / n;
for (int i = 1; i < n; i++)
{
var x = new PointF(i * m, 0);
var y = new PointF(i * m, img.Height);
grp.DrawLine(Pens.Red, x, y);
}
for (int i = 1; i <= (int)(this.Height / m); i++)
{
var x = new PointF(0, i * m);
var y = new PointF(img.Width, i * m);
grp.DrawLine(new Pen(Color.Red, 5f), x, y);
}
return img;
}
void BtnExportClick(object sender, EventArgs e)
{
if(saveFileDialog1.ShowDialog() == DialogResult.OK)
{
int n = (int)numericUpDown1.Value;
drawGrid(n, txtImagePath.Text).Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
MessageBox.Show("Done");
}
}
图像绘制网格(int n,字符串imgPath)
{
Image img=Image.FromFile(imgPath);
Graphics grp=Graphics.FromImage(img);
grp.SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.HighQuality;
浮子m=最小宽度*1f/n;
对于(int i=1;i 对于(int i=1;i而言,主要问题在于这一行:
for (int i = 1; i <= (int)(this.Height / m); i++)
由此确定该单元:
var gridStepMin = Math.Min(image.Width, image.Height) / gridSize;
var gridStepMax = Math.Max(image.Width, image.Height) / gridSize;
主要问题在这方面:
for (int i = 1; i <= (int)(this.Height / m); i++)
由此确定该单元:
var gridStepMin = Math.Min(image.Width, image.Height) / gridSize;
var gridStepMax = Math.Max(image.Width, image.Height) / gridSize;
多么简单的一个错误,我找不到:)顺便说一句,我希望宽度的方块由用户选择,高度的方块由这个值决定。我处理了那个部分。谢谢你的详细回答。多简单的错误我找不到:)顺便说一句,我希望宽度的方块由用户选择,高度的方块由这个值决定。我处理了那个部分。谢谢你的回答他回答得很详细。
var gridStepMin = Math.Min(image.Width, image.Height) / gridSize;
var gridStepMax = Math.Max(image.Width, image.Height) / gridSize;
private Image DrawSquaredGrid(int gridSection, string imgPath, Color penColor, float penSize)
{
var image = Image.FromStream(new MemoryStream(File.ReadAllBytes(imgPath)), true);
using (var g = Graphics.FromImage(image)) {
g.PixelOffsetMode = PixelOffsetMode.Half;
var gridSize = (float)Math.Min(image.Width, image.Height) / gridSection;
var gridStepMin = Math.Min(image.Width, image.Height) / gridSize;
var gridStepMax = Math.Max(image.Width, image.Height) / gridSize;
for (int i = 1; i < gridStepMin; i++) {
var pointY1 = new PointF(i * gridSize, 0);
var pointY2 = new PointF(i * gridSize, image.Height);
using (var pen = new Pen(penColor, penSize)) {
g.DrawLine(pen, pointY1, pointY2);
}
}
for (int i = 1; i < gridStepMax; i++) {
var pointX1 = new PointF(0, i * gridSize);
var pointX2 = new PointF(image.Width, i * gridSize);
using (var pen = new Pen(penColor, penSize)) {
g.DrawLine(pen, pointX1, pointX2);
}
}
return image;
}
}
private void BtnExportClick(object sender, EventArgs e)
{
string imagePath = [Some Path];
using (var sfd = new SaveFileDialog()) {
sfd.Filter = "PNG Image (*.png)|*.png|TIFF Image (*.tif)|*.tif|JPEG Image (*.jpg)|*.jpg";
sfd.RestoreDirectory = true;
sfd.AddExtension = true;
if (sfd.ShowDialog() == DialogResult.OK) {
Image image = null;
if (chkSquared.Checked) {
image = DrawSquaredGrid((int)numericUpDown1.Value, imagePath, Color.Red, 5.0f);
}
else {
image = DrawGridLines((int)numericUpDown1.Value, imagePath, Color.Red, 5.0f);
}
image.Save(sfd.FileName, ImageFormatFromFileName(sfd.FileName));
MessageBox.Show("Done");
image.Dispose();
}
}
}
private ImageFormat ImageFormatFromFileName(string fileName)
{
string fileType = Path.GetExtension(fileName).Remove(0, 1);
if (fileType.Equals("tif")) fileType = "tiff";
if (fileType.Equals("jpg")) fileType = "jpeg";
return (ImageFormat)new ImageFormatConverter().ConvertFromString(fileType);
}