图像处理代码帮助- c#
本文关键字:帮助 代码 图像处理 | 更新日期: 2023-09-27 18:16:08
好了,是时候获得更多的n00b帮助了。
我一直在用c# (Mono,确切地说)编写这段代码。它的目的是获取图像,逐像素分解,并将R,G和B值作为颜色坐标写入文本文件。
问题是,我没有得到任何处理。我只得到一个红色的0 (for()循环上方的百分比函数)和一个空文件。没有生成文本/坐标。为了清楚起见,我将把控制台输出放在代码本身的下面。
using System;
using System.Drawing;
using System.Drawing.Imaging;
namespace Image_Interpreter_I
{
class MainClass
{
public static void Main (string[] args)
{
Console.WriteLine ("Enter filepath for bitmap image");
Console.ForegroundColor = ConsoleColor.Blue;
string filepath = Console.ReadLine ();
Console.ResetColor();
Bitmap image1 = new Bitmap(System.Drawing.Image.FromFile(filepath, true));
Console.WriteLine ("Enter filepath for file interpretation output");
Console.ForegroundColor = ConsoleColor.Blue;
string filepath2 = Console.ReadLine();
Console.ResetColor();
int i;
i = 1;
int ImW, ImH;
string ImWstr, ImHstr;
Console.WriteLine ("Enter width of image:");
Console.ForegroundColor = ConsoleColor.Blue;
ImWstr = Console.ReadLine ();
Console.ResetColor ();
ImW = Convert.ToInt16 (ImWstr);
Console.WriteLine ("Enter height of image:");
Console.ForegroundColor = ConsoleColor.Blue;
ImHstr = Console.ReadLine ();
ImH = Convert.ToInt16 (ImHstr);
decimal percent;
percent = (i / (ImH * ImW)) * 100;
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine (percent);
Console.ResetColor ();
for (int y = 1; y <= ImH; y++)
{
for (int x = 1; x <= ImW; x++)
{
Color pixelColor = image1.GetPixel(x,y);
byte r = pixelColor.R;
byte g = pixelColor.G;
byte b = pixelColor.B;
string pixData = String.Format ("({0},{1},{2}", new object[] {r, g, b});
using (System.IO.StreamWriter file = new System.IO.StreamWriter(filepath2))
{
file.WriteLine(pixData);
}
}
}
i++;
}
}
}
控制台输出:
输入位图图像的文件路径
/用户/user0/桌面/IMG_1528.JPG
输入文件解释输出的文件路径
/用户/user0/桌面/imageData.txt
输入图像宽度:
2448输入图像高度:32640
第一件事:在每个循环条目上创建新的流写入器-每次都会覆盖现有文件,并且速度很慢。先创建这个流,然后再进行处理。
using (var file = new System.IO.StreamWriter(filepath2))
{
// for loops
}
第二,根据文档:位图。GetPixel像素被索引为0到Width-1
/Height-1
-这在for循环中给出了不正确的值。从0开始,改变回路结束条件为y < ImH
和x < ImW
另一件事-尝试更好地格式化代码,提取方法以便更容易理解和阅读代码。
static void Main(string[] args)
{
string filepath = @"C:'SomePath'SomeFile.JPG";
Bitmap image1 = new Bitmap(System.Drawing.Image.FromFile(filepath, true));
string filepath2 = @"C:'temp'myFile.txt";
using (System.IO.StreamWriter file = new System.IO.StreamWriter(filepath2))
{
for (int y = 0; y < image1.Height; y++)
{
for (int x = 0; x < image1.Width; x++)
{
Color pixelColor = image1.GetPixel(x, y);
byte r = pixelColor.R;
byte g = pixelColor.G;
byte b = pixelColor.B;
string pixData = String.Format("({0},{1},{2})", new object[] { r, g, b });
file.WriteLine(pixData);
}
}
}
}
我会尝试在循环外打开文件:
using (System.IO.StreamWriter file = new System.IO.StreamWriter(filepath2))
{
for (int y = 1; y <= ImH; y++)
{
for (int x = 1; x <= ImW; x++)
{
Color pixelColor = image1.GetPixel(x,y);
byte r = pixelColor.R;
byte g = pixelColor.G;
byte b = pixelColor.B;
string pixData = String.Format ("({0},{1},{2}", new object[] {r, g, b});
file.WriteLine(pixData);
}
}
}
这应该有帮助:)