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

本文关键字:灰度 绘制 数据 十六进制 | 更新日期: 2023-09-27 17:54:46

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

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

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

对于您所写的内容(太少),您可以创建Bitmap bmp = new Bitmap(200,200)
然后你可以根据你的文本数据使用bmp.SetPixel(x,y,color)

:
假设很多事情:

  • 你有一个hexstr包含十六进制数据代表你的bmp
  • hexstr由两个字符组(十六进制数据)组成
  • 每个十六进制数据组长度为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;
}