Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从十六进制数据绘制灰度图_C#_.net - Fatal编程技术网

C# 从十六进制数据绘制灰度图

C# 从十六进制数据绘制灰度图,c#,.net,C#,.net,我有十六进制数据,我想把它转换成200x200像素的灰度图片,但我找不到一个方法来做 有谁能告诉我解决这个问题的方法或给我一个资源吗?对于你写的东西(太少),你可以创建Bitmap bmp=new Bitmap(200200) 然后可以根据文本数据使用bmp.SetPixel(x,y,color) 更新: 假设有很多事情: 您有一个包含表示bmp的十六进制数据的hexstr hextr由两个字符组组成(十六进制数据) 每个十六进制数据组的长度为2或6个字符(如果十六进制值已经是灰度值,则为2个

我有十六进制数据,我想把它转换成200x200像素的灰度图片,但我找不到一个方法来做

有谁能告诉我解决这个问题的方法或给我一个资源吗?

对于你写的东西(太少),你可以创建
Bitmap bmp=new Bitmap(200200)

然后可以根据文本数据使用
bmp.SetPixel(x,y,color)

更新
假设有很多事情:

  • 您有一个包含表示bmp的十六进制数据的hexstr
  • hextr由两个字符组组成(十六进制数据)
  • 每个十六进制数据组的长度为2或6个字符(如果十六进制值已经是灰度值,则为2个字符;如果要将RGB值转换为灰度值,则为6个字符)
第二次更新
您的文件包含16x2450=39200像素,因此图像不能为200x200。我猜是200x192。
这段代码有效,即使我不明白图像代表什么

您可以尝试以下方法:

public Form1()
{
    InitializeComponent();
    string hexstr = FileToHexStr(path_to_file);
    pictureBox1.Image = ConvertToBmp(hexstr, 200, 196, true);
}

private string FileToHexStr(string filename)
{
    StringBuilder sb = new StringBuilder();
    string[] f = File.ReadAllLines(filename);
    foreach (string s in f) sb.Append(s.Trim().Replace(" ", ""));
    return sb.ToString();
}

private byte[] StringToByteArray(string hex)
{
    return Enumerable.Range(0, hex.Length)
                     .Where(x => x % 2 == 0)
                     .Select(x => System.Convert.ToByte(hex.Substring(x, 2), 16))
                     .ToArray();
}

private Bitmap ConvertToBmp(string hexstr, int width, int height, bool isGrayScaleString)
{
    /// If hexstr is a color bitmap I assume that a single pixel
    /// must be 3 values long (one for R, one for G, one for B);
    /// if not, then every hex value is a pixel
    int bpp = isGrayScaleString ? 1 : 3;
    byte[] hexarr = StringToByteArray(hexstr);
    // Check if string is correct
    if (hexarr.Length != (width * height * bpp)) return null;

    Bitmap bmp = new Bitmap(width, height);
    int index = 0;
    for (int i = 0; i < hexarr.Length; i +=  bpp)
    {
        int luma = (int)(isGrayScaleString ?
            hexarr[index] :
            // Formula to convert from RGB to Grayscale
            // <see>http://www.bobpowell.net/grayscale.htm</see>
            0.3 * hexarr[i] + 0.59 * hexarr[i + 1] + 0.11 * hexarr[i + 2]);
        Color c = Color.FromArgb(luma, luma, luma);
        bmp.SetPixel(index % width, index / width, c);
        index++;
    }
    return bmp;
}
public Form1()
{
初始化组件();
字符串hexstr=FileToHexStr(路径到文件);
pictureBox1.Image=ConvertToBmp(hexstr,200196,true);
}
私有字符串FileToHexStr(字符串文件名)
{
StringBuilder sb=新的StringBuilder();
字符串[]f=File.ReadAllLines(文件名);
foreach(f中的字符串s)sb.Append(s.Trim().Replace(“,”);
使某人返回字符串();
}
专用字节[]StringToByteArray(字符串十六进制)
{
返回可枚举的范围(0,十六进制长度)
。其中(x=>x%2==0)
.Select(x=>System.Convert.ToByte(十六进制子字符串(x,2,16))
.ToArray();
}
私有位图ConvertToBmp(字符串hexstr、整型宽度、整型高度、布尔isGrayScaleString)
{
///如果hextr是一个彩色位图,我假设一个像素
///必须有3个值长(一个用于R,一个用于G,一个用于B);
///如果不是,则每个十六进制值都是一个像素
int-bpp=isGrayScaleString?1:3;
字节[]hexarr=StringToByteArray(hexstr);
//检查字符串是否正确
if(hexarr.Length!=(width*height*bpp))返回null;
位图bmp=新位图(宽度、高度);
int指数=0;
对于(int i=0;i
请解释您想做得更好的地方。图像是否应以选定的字体/字体大小显示给定的文本?ascii数据与像素颜色的关系如何?你的数据怎么样?对不起,我把ascii和十六进制弄错了,我在学校的任务实际上是让我用十六进制的数据制作一张灰度图片…你能帮我吗,我真的很困惑,这是我的联系人ecaiseng@yahoo.com,非常感谢您的帮助…您应该澄清您使用的输入格式(例如,它是一个字符串、一个字节数组还是一个内存地址?你也可以只发布实际任务的文本或给定的数据/值。@marco:对不起,这里的internet连接很差,我试试你的代码(它运行得很顺利)并对我之前在网站上找到的代码进行一些实验..但我无法将其变成我计划使用的,@marco:我应该使用picturebox方法吗?当我使用操作按钮将我的十六进制数据转换为图像时,代码显示错误生成…这是我根据您的代码尝试的代码…@marco:在按钮转换中显示错误单击方法和按钮转换t内嵌位图bmp=ButtonConConvert(hexstr,200200,isGrayScale)…哦,是的,这是我需要转换成图像…@ecaiseng:很多事情。首先,新代码发布了,它可以工作。第二:你不是一个好学生,你既不擅长自己写代码,也不理解我的代码…所以,看在上帝的份上:学习,学习很多。你的家庭作业不能总是由别人完成。接受我的答案作为答案好好学习我的代码,相信我!!!