在这种情况下,每次更改numericUpDown值时,它都会创建一个新目录。 numericUpDoown设置为最小值10和最大值502。 在这种情况下,我使用的文件是512x512分辨率。
我想要做的是,如果例如numericUpdown设置为值10,我将点击确认按钮,它将创建许多目录,每个目录名称应如下所示:
SecondProcess_5132014-559-502x502
将创建的下一个目录将具有以下名称:
SecondProcess_5132014-549-492x492
下一个目录
SecondProcess_5132014-539-482x482
如果numericUpDown中的值现在为20,则第一个目录将为:
SecondProcess_5132014-559-492x492
然后
SecondProcess_5132014-559-472x472
所以我现在有了这段代码,但我想自动创建所有这些目录:
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
numeric = (int)numericUpDown1.Value;
path = Path.Combine(@"c:\temp\newimages",
String.Concat("SecondProcess_", DateTime.Now.ToString("MMddyyyy-HHmmss")));
Directory.CreateDirectory(path);
}
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bgw = (BackgroundWorker)sender;
if (bgw.CancellationPending == true)
{
}
else
{
Image img;
DirectoryInfo di1;
FileInfo[] fi1;
for (int i = 0; i < myGifList.Count; i++)
{
Image image = Image.FromFile(myGifList[i]);
int imageWidth = image.Width;
int imageHeight = image.Height;
img = resizeImage(imageWidth - numeric, imageHeight - numeric, myGifList[i]);
img.Save(path + "\\" + Path.GetFileName(myGifList[i]), System.Drawing.Imaging.ImageFormat.Gif);
}
di1 = new DirectoryInfo(path);
fi1 = di1.GetFiles("*.gif");
List<string> newImages = new List<string>();
for (int i = 0; i < fi1.Length; i++)
{
newImages.Add(fi1[i].FullName);
}
unfreez.MakeGIF(newImages, path + "\\" + "animated.gif", 8, true);
}
}
private void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
}
private void backgroundWorker2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
pictureBoxImage(path + "\\" + "animated.gif");
label10.Text = FileSize(path + "\\" + "animated.gif");
label12.Text = ImageResolution(path + "\\" + "animated.gif");
label7.Visible = true;
label7.ForeColor = Color.Green;
label7.Text = "Operation Have Been Completed";
button1.Enabled = false;
progressBar2.EndColor = Color.FromArgb(0, 211, 040);
numericUpDown1.Enabled = true;
button3.Enabled = true;
}
private void button3_Click(object sender, EventArgs e)
{
numericUpDown1.Enabled = false;
button3.Enabled = false;
backgroundWorker2.RunWorkerAsync();
}
它的作用是每次我更改numericUpDown值,如果它是10并且我点击按钮它将创建一个目录并放置所有图像和我创建的动画gif。 如果我将numericupdown值更改为20并单击该按钮,它将创建另一个包含图像和GIF动画的目录。
但我想要的是另外一个按钮如果我点击他并且vlaue是10这么自动它会根据文件分辨率和backgroundworker创建目录数。
我该怎么做?
修改
我尝试在此按钮点击事件中执行此操作:
private void button4_Click(object sender, EventArgs e)
{
Image img = Image.FromFile(previewFileName);
int width = img.Width;
int height = img.Height;
int dirsnumbers = width / numeric;
for (int i = 0; i < dirsnumbers; i++)
{
path = Path.Combine(@"c:\temp\newimages",
String.Concat("SecondProcess_", DateTime.Now.ToString("MMddyyyy-HHmmss")) +
"-" + "Width = " + (width - numeric) + " Height = " + (height - numeric) );
Directory.CreateDirectory(path);
}
}
在此示例中,numeric = 10 和宽度= 512 所以它应该创建51个目录,但它只创建了一个目录。
另一个问题是512/10 = 51.2我无法创建51.2目录,所以如何检查51.2或51.3或51.9是否只能创建51个目录?
编辑**
private void button4_Click(object sender, EventArgs e)
{
Image img = Image.FromFile(previewFileName);
int width = img.Width;
int height = img.Height;
double res = width / numeric;
int dirsnumbers = (int)Math.Floor(res);
for (int i = 0; i <= dirsnumbers; i++)
{
width = width - numeric;
height = height - numeric;
path = Path.Combine(@"c:\temp\newimages",
String.Concat("SecondProcess_", DateTime.Now.ToString("MMddyyyy-HHmmss")) +
"-" + "Width = " + (width - numeric) + " Height = " + (height - numeric));
if (width > 0 && height > 0)
{
Directory.CreateDirectory(path);
}
}
}
我所做的是在循环中添加了这两行:
width = width - numeric;
height = height - numeric;
但由于某种原因,我不明白为什么所有创建的目录都可以,但只有一个是奇怪的:
SecondProcess_05132014-193441-Width = -8 Height = -8
我无法弄清楚这减去8的来源。它们位于另外两个目录之间:
SecondProcess_05132014-193441-Width = 2 Height = 2 and SecondProcess_05132014-193441-Width = 12 Height = 12
也许这个-8有这条线的东西:
int dirsnumbers = (int)Math.Floor(res);
使用Math.Floor?
答案 0 :(得分:1)
从你问题的最后两行开始 -
另一个问题是512/10 = 51.2我无法创建51.2目录 那么我如何检查是否是51.2或51.3或51.9告诉它创建 只有51个目录?
为此你必须使用 - Math.Floor()
我发现其余部分是正确的,所以现在您的代码看起来像这样 - 您也可以在Dotnet Fiddle中查看它。
private void button4_Click(object sender, EventArgs e)
{
Image img = Image.FromFile(previewFileName);
int width = img.Width;
int height = img.Height;
double res = width / numeric;
int dirsnumbers = (int)Math.Floor(res);
for (int i = 0; i <= dirsnumbers; i++)
{
path = Path.Combine(@"c:\temp\newimages",
String.Concat("SecondProcess_", DateTime.Now.ToString("MMddyyyy-HHmmss")) +
"-" + "Width = " + (width - numeric) + " Height = " + (height - numeric));
if (width > 0 && height > 0)
{
Directory.CreateDirectory(path);
}
width = width - numeric;
height = height - numeric;
}
}
答案 1 :(得分:-2)
在另一个线程(后台工作者)中使用具有相应名称的格式化字符串循环遍历mkdir。
mkdir("./some/path/string");
您可以访问文件解析,因此您可以对该信息进行正则表达式,并从中创建一个int。从那里你可以找到两个分辨率中的最大值。然后遍历最大值并减少两者,创建一个新目录。