C# 获取图像的RGB值并可能在C中移动图像文件#
我正在看一个C#项目,它查看一个图像文件,但不确定扩展名,并记录RGB值,如果它太暗,则将其移动到另一个文件夹中,以便我稍后查看 这里是块形式的 从目录加载多个图像>检查每个文件的RGB值>如果太暗>移动到其他文件夹。如果不忽略(保留在原始文件夹中) 我知道一些基本知识,比如从dir获取文件,但检查整张图片的RGB值,然后移动它或忽略它,我被难住了 我有以下代码:C# 获取图像的RGB值并可能在C中移动图像文件#,c#,file-io,rgb,C#,File Io,Rgb,我正在看一个C#项目,它查看一个图像文件,但不确定扩展名,并记录RGB值,如果它太暗,则将其移动到另一个文件夹中,以便我稍后查看 这里是块形式的 从目录加载多个图像>检查每个文件的RGB值>如果太暗>移动到其他文件夹。如果不忽略(保留在原始文件夹中) 我知道一些基本知识,比如从dir获取文件,但检查整张图片的RGB值,然后移动它或忽略它,我被难住了 我有以下代码: private void button1_Click(object sender, EventArgs e) {
private void button1_Click(object sender, EventArgs e)
{
CompareImages(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures),
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "checked"), 127.0, new string[] {"*.jpg", "*.png"});
}
private void CompareImages(string sourceFolder, string disposedImgFolder, double threshold, string[] extensions)
{
if (Directory.Exists(sourceFolder))
{
DirectoryInfo dir = new DirectoryInfo(sourceFolder);
List<FileInfo> pictures = new List<FileInfo>();
foreach (string ext in extensions)
{
FileInfo[] fi = dir.GetFiles(ext);
pictures.AddRange(fi);
}
Directory.CreateDirectory(disposedImgFolder);
int j = 0;
if (pictures.Count > 0)
{
for (int i = 0; i < pictures.Count; i++)
{
Image img = null;
Bitmap bmp = null;
try
{
img = Image.FromFile(pictures[i].FullName);
bmp = new Bitmap(img);
img.Dispose();
double avg = GetAveragePixelValue(bmp);
bmp.Dispose();
if (avg < threshold)
{
string dest = Path.Combine(disposedImgFolder, pictures[i].Name);
if (File.Exists(dest) == false)
{
pictures[i].MoveTo(dest);
j++;
}
else
{
}
}
else
{
}
}
catch
{
if (img != null)
img.Dispose();
if (bmp != null)
bmp.Dispose();
}
}
MessageBox.Show("Done, " + j.ToString() + " files moved.");
}
}
}
private unsafe double GetAveragePixelValue(Bitmap bmp)
{
BitmapData bmData = null;
try
{
bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
int stride = bmData.Stride;
IntPtr scan0 = bmData.Scan0;
int w = bmData.Width;
int h = bmData.Height;
double sum = 0;
long pixels = bmp.Width * bmp.Height;
byte* p = (byte*)scan0.ToPointer();
for (int y = 0; y < h; y++)
{
p = (byte*)scan0.ToPointer();
p += y * stride;
for (int x = 0; x < w; x++)
{
double i = ((double)p[0] + p[1] + p[2]) / 3.0;
sum += i;
p += 4;
}
}
bmp.UnlockBits(bmData);
double result = sum / (double)pixels;
return result;
}
catch
{
try
{
bmp.UnlockBits(bmData);
}
catch
{
}
}
return -1;
}
private void按钮1\u单击(对象发送者,事件参数e)
{
比较图像(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures),
Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory),“checked”),127.0,新字符串[]{“*.jpg”,“*.png”});
}
私有void CompareImages(字符串sourceFolder、字符串disposedImgFolder、双阈值、字符串[]扩展名)
{
if(Directory.Exists(sourceFolder))
{
DirectoryInfo dir=新的DirectoryInfo(sourceFolder);
列表图片=新列表();
foreach(扩展名中的字符串扩展名)
{
FileInfo[]fi=dir.GetFiles(ext);
图片。添加范围(fi);
}
Directory.CreateDirectory(disposedImgFolder);
int j=0;
如果(pictures.Count>0)
{
对于(int i=0;i
如何定义threashold?我想您需要了解一下RGB。每个像素都有一个红色、绿色和蓝色的值,我猜你在寻找一种方法来测量“平均”像素的亮度?如果是这样,您需要在所有像素上循环。执行此操作时,计算每个像素的亮度。每个像素的“亮度”可以用几种方法计算,你可以简单地做(R+G+B)/3,或者你可以试着模拟人眼对R、G和B不一样敏感 然后你必须决定如何使用像素的“亮度”。你是说,中位数,还有别的吗?这取决于你想做什么 更新:在阅读了您的更多评论后,我仍然不确定您所说的“亮”或“暗”是什么意思。您的术语似乎有点混乱,您一直在谈论整个图像的RGB值,但图像中的RGB值指的是单个像素值 我相信这一页可以帮助你做你想做的事情: 另外,一些免费阅读,以了解RGB: )
我想你需要了解一下RGB。每个像素都有一个红色、绿色和蓝色的值,我猜你在寻找一种方法来测量“平均”像素的亮度?如果是这样,您需要在所有像素上循环。执行此操作时,计算每个像素的亮度。每个像素的“亮度”可以用几种方法计算,你可以简单地做(R+G+B)/3,或者你可以试着模拟人眼对R、G和B不一样敏感 然后你必须决定如何使用像素的“亮度”。你是说,中位数,还有别的吗?这取决于你想做什么 更新:在阅读了您的更多评论后,我仍然不确定您所说的“亮”或“暗”是什么意思。信息技术
using (var m = new MemoryStream())
{
using (var img = Image.FromFile(args[0]))
{
img.Save(m, ImageFormat.Bmp);
}
m.Position = 0;
using (var bitmap = (Bitmap)Bitmap.FromStream(m))
{
for (var x = 0; x < bitmap.Width; x++)
{
for (var y = 0; y < bitmap.Height; y++)
{
var color = bitmap.GetPixel(x, y);
// TODO: Do what ever you want
}
}
}
}