C# 画图问题,没几分了,求大神看下。

gaofzhs 2013-12-19 09:20:04
请大神给分析下,代码功能如下,有一个文本,文本内容以00-09为主,每一个数字代表一个颜色,文本是按照图片宽、高写的,比如图片是640*480,那么文本每一行是1280个字符(因为代表颜色的是双位数),一共480行,下面的代码可以画出图来(颜色是乱设定的),现在可以实现画图功能,但是非常慢,求大神给优化下。
private void DrawImage(string s)
{
StringBuilder sb = new StringBuilder();
string[] s1 = s.Replace("\r\n", "|").Split('|');
int l, w;
l = l4;
w = a4;
Bitmap bmp = new Bitmap(l, w);
Graphics draw = Graphics.FromImage(bmp);
draw.Clear(Color.Black);
Color c = Color.FromArgb(255);
Pen p = new Pen(c);
p.Color = Color.FromArgb(255);
for (int i = 0; i < w; i++)
{
for (int a = 0; a < l*2; a++)
{
#region
switch (s1[i].Substring(a, 2))
{
case "00":
{
p.Color = Color.FromArgb(0, 255, 0);
draw.DrawRectangle(p, a/2, i, 1, 1);
a++;
break;
}
case "02":
{
p.Color = Color.FromArgb(255, 255, 0);
draw.DrawRectangle(p, a/2, i, 1, 1);
a++;
break;
}
case "03":
{
p.Color = Color.FromArgb(0, 255, 255);
draw.DrawRectangle(p, a/2, i, 1, 1);
a++;
break;
}
case "04":
{
p.Color = Color.FromArgb(0, 0, 0);
draw.DrawRectangle(p, a/2, i, 1, 1);
a++;
break;
}
case "05":
{
p.Color = Color.FromArgb(255, 255, 255);
draw.DrawRectangle(p, a/2, i, 1, 1);
a++;
break;
}
case "06":
{
p.Color = Color.FromArgb(0, 0, 255);
draw.DrawRectangle(p, a/2, i, 1, 1);
a++;
break;
}
case "07":
{
p.Color = Color.FromArgb(100, 100, 100);
draw.DrawRectangle(p, a/2, i, 1, 1);
a++;
break;
}
case "08":
{
p.Color = Color.FromArgb(100, 100, 0);
draw.DrawRectangle(p, a/2, i, 1, 1);
a++;
break;
}
case "09":
{
p.Color = Color.FromArgb(100, 0, 0);
draw.DrawRectangle(p, a/2, i, 1, 1);
a++;
break;
}
}
#endregion
}
}
draw.Dispose();
bmp.Save("D:\\a.bmp");
}
}
...全文
121 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaofzhs 2013-12-19
  • 打赏
  • 举报
回复
5楼你为什么放弃治疗……
gaofzhs 2013-12-19
  • 打赏
  • 举报
回复
引用 4 楼 hwenycocodq520 的回复:

public Dictionary<string, Color> ColorTable;

Load:
   ColorTable = new Dictionary<string, Color>();
   ColorTable.Add("00", Color.FromArgb(0, 255, 0));
   ColorTable.Add("02", Color.FromArgb(255, 255, 0));
   ColorTable.Add("03", Color.FromArgb(0, 255, 255));
   ColorTable.Add("04", Color.FromArgb(0, 0, 0));
   ColorTable.Add("05", Color.FromArgb(255, 255, 255));
   ColorTable.Add("06", Color.FromArgb(0, 0, 255));
   ColorTable.Add("07", Color.FromArgb(100, 100, 100));
   ColorTable.Add("08", Color.FromArgb(100, 100, 0));
   ColorTable.Add("09", Color.FromArgb(100, 0, 0));

private void DrawImage(string s)
{
    string s1 = s.Replace("\r\n", "");
    int l, w;
    l = l4;
    w = a4;
    Bitmap bmp = new Bitmap(l, w);
    BitmapData bdata = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
    byte[] buffer = new byte[bmp.Height * bdata.Stride];
    int index=0;
    for (int i = 0; i < buffer.Length; i += 4) //for 32 bit
    {
         Color color = ColorTable[s1.Substring(index, 2)];
         index += 2;
         buffer[i + 0] = color.B;
         buffer[i + 1] = color.G;
         buffer[i + 2] = color.R;
         buffer[i + 3] = color.A;
     }
     Marshal.Copy(buffer,0,bdata.Scan0,buffer.Length);
     bmp.UnlockBits(bdata);
     bmp.Save("D:\\a.bmp");
     bmp.Dispose();
}
弄懂了,感谢!
智商余额不足 2013-12-19
  • 打赏
  • 举报
回复

public static class XXX
{
    public static Dictionary<string, Color> ColorTable;
    static XXX()
    {
        ColorTable = new Dictionary<string, Color>();
        ColorTable.Add("00", Color.FromArgb(0, 255, 0));
        ColorTable.Add("02", Color.FromArgb(255, 255, 0));
        ColorTable.Add("03", Color.FromArgb(0, 255, 255));
        ColorTable.Add("04", Color.FromArgb(0, 0, 0));
        ColorTable.Add("05", Color.FromArgb(255, 255, 255));
        ColorTable.Add("06", Color.FromArgb(0, 0, 255));
        ColorTable.Add("07", Color.FromArgb(100, 100, 100));
        ColorTable.Add("08", Color.FromArgb(100, 100, 0));
        ColorTable.Add("09", Color.FromArgb(100, 0, 0));
    }
} 

//Color color = ColorTable[s1.Substring(index, 2)];
Color color = XXX.ColorTable[s1.Substring(index, 2)];
gaofzhs 2013-12-19
  • 打赏
  • 举报
回复
引用 4 楼 hwenycocodq520 的回复:

public Dictionary<string, Color> ColorTable;

Load:
   ColorTable = new Dictionary<string, Color>();
   ColorTable.Add("00", Color.FromArgb(0, 255, 0));
   ColorTable.Add("02", Color.FromArgb(255, 255, 0));
   ColorTable.Add("03", Color.FromArgb(0, 255, 255));
   ColorTable.Add("04", Color.FromArgb(0, 0, 0));
   ColorTable.Add("05", Color.FromArgb(255, 255, 255));
   ColorTable.Add("06", Color.FromArgb(0, 0, 255));
   ColorTable.Add("07", Color.FromArgb(100, 100, 100));
   ColorTable.Add("08", Color.FromArgb(100, 100, 0));
   ColorTable.Add("09", Color.FromArgb(100, 0, 0));

private void DrawImage(string s)
{
    string s1 = s.Replace("\r\n", "");
    int l, w;
    l = l4;
    w = a4;
    Bitmap bmp = new Bitmap(l, w);
    BitmapData bdata = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
    byte[] buffer = new byte[bmp.Height * bdata.Stride];
    int index=0;
    for (int i = 0; i < buffer.Length; i += 4) //for 32 bit
    {
         Color color = ColorTable[s1.Substring(index, 2)];
         index += 2;
         buffer[i + 0] = color.B;
         buffer[i + 1] = color.G;
         buffer[i + 2] = color.R;
         buffer[i + 3] = color.A;
     }
     Marshal.Copy(buffer,0,bdata.Scan0,buffer.Length);
     bmp.UnlockBits(bdata);
     bmp.Save("D:\\a.bmp");
     bmp.Dispose();
}
请问,这个加在什么地方?? public Dictionary<string, Color> ColorTable; Load: ColorTable = new Dictionary<string, Color>(); ColorTable.Add("00", Color.FromArgb(0, 255, 0)); ColorTable.Add("02", Color.FromArgb(255, 255, 0)); ColorTable.Add("03", Color.FromArgb(0, 255, 255)); ColorTable.Add("04", Color.FromArgb(0, 0, 0)); ColorTable.Add("05", Color.FromArgb(255, 255, 255)); ColorTable.Add("06", Color.FromArgb(0, 0, 255)); ColorTable.Add("07", Color.FromArgb(100, 100, 100)); ColorTable.Add("08", Color.FromArgb(100, 100, 0)); ColorTable.Add("09", Color.FromArgb(100, 0, 0));
卧_槽 2013-12-19
  • 打赏
  • 举报
回复
引用 4 楼 hwenycocodq520 的回复:

public Dictionary<string, Color> ColorTable;

Load:
   ColorTable = new Dictionary<string, Color>();
   ColorTable.Add("00", Color.FromArgb(0, 255, 0));
   ColorTable.Add("02", Color.FromArgb(255, 255, 0));
   ColorTable.Add("03", Color.FromArgb(0, 255, 255));
   ColorTable.Add("04", Color.FromArgb(0, 0, 0));
   ColorTable.Add("05", Color.FromArgb(255, 255, 255));
   ColorTable.Add("06", Color.FromArgb(0, 0, 255));
   ColorTable.Add("07", Color.FromArgb(100, 100, 100));
   ColorTable.Add("08", Color.FromArgb(100, 100, 0));
   ColorTable.Add("09", Color.FromArgb(100, 0, 0));

private void DrawImage(string s)
{
    string s1 = s.Replace("\r\n", "");
    int l, w;
    l = l4;
    w = a4;
    Bitmap bmp = new Bitmap(l, w);
    BitmapData bdata = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
    byte[] buffer = new byte[bmp.Height * bdata.Stride];
    int index=0;
    for (int i = 0; i < buffer.Length; i += 4) //for 32 bit
    {
         Color color = ColorTable[s1.Substring(index, 2)];
         index += 2;
         buffer[i + 0] = color.B;
         buffer[i + 1] = color.G;
         buffer[i + 2] = color.R;
         buffer[i + 3] = color.A;
     }
     Marshal.Copy(buffer,0,bdata.Scan0,buffer.Length);
     bmp.UnlockBits(bdata);
     bmp.Save("D:\\a.bmp");
     bmp.Dispose();
}
你真有空。。。
智商余额不足 2013-12-19
  • 打赏
  • 举报
回复

public Dictionary<string, Color> ColorTable;

Load:
   ColorTable = new Dictionary<string, Color>();
   ColorTable.Add("00", Color.FromArgb(0, 255, 0));
   ColorTable.Add("02", Color.FromArgb(255, 255, 0));
   ColorTable.Add("03", Color.FromArgb(0, 255, 255));
   ColorTable.Add("04", Color.FromArgb(0, 0, 0));
   ColorTable.Add("05", Color.FromArgb(255, 255, 255));
   ColorTable.Add("06", Color.FromArgb(0, 0, 255));
   ColorTable.Add("07", Color.FromArgb(100, 100, 100));
   ColorTable.Add("08", Color.FromArgb(100, 100, 0));
   ColorTable.Add("09", Color.FromArgb(100, 0, 0));

private void DrawImage(string s)
{
    string s1 = s.Replace("\r\n", "");
    int l, w;
    l = l4;
    w = a4;
    Bitmap bmp = new Bitmap(l, w);
    BitmapData bdata = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
    byte[] buffer = new byte[bmp.Height * bdata.Stride];
    int index=0;
    for (int i = 0; i < buffer.Length; i += 4) //for 32 bit
    {
         Color color = ColorTable[s1.Substring(index, 2)];
         index += 2;
         buffer[i + 0] = color.B;
         buffer[i + 1] = color.G;
         buffer[i + 2] = color.R;
         buffer[i + 3] = color.A;
     }
     Marshal.Copy(buffer,0,bdata.Scan0,buffer.Length);
     bmp.UnlockBits(bdata);
     bmp.Save("D:\\a.bmp");
     bmp.Dispose();
}
卧_槽 2013-12-19
  • 打赏
  • 举报
回复
撸主的方法不能不说是很奇葩的。 为了修改一个像素点的颜色就去画一个矩形。。。。。 去吧GDI+的msdn都读一遍肯定能找到更好的办法。
  • 打赏
  • 举报
回复
并行处理并行处理并行处理并行处理并行处理并行处理
銩铥熊 2013-12-19
  • 打赏
  • 举报
回复
没有什么好的办法,等待接分......

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧