Bitmap的替代方法是什么,以便我可以将double / float值存储在其像素中,而无需转换为int / byte?

时间:2017-10-23 00:21:01

标签: c# bitmap

我从双打数组创建一个位图(对于我从数组中定义颜色的每个像素)。并且由于Color类型只能存储整数值(从0到255),我必须在将数组值存储到Bitmap的颜色值之前将其转换为int或byte。但是,当然,由于转换,我丢失了信息。所以我需要一些方法来存储我的双值来表示图像的颜色,而不会有任何损失。

更新: 问题是Bitmap使用Color类型,它需要一个小范围的整数。有可能以双值形式(例如从0到1)表示颜色并将其存储在图像中。但据我所知,Bitmap并没有提供这个机会。

1 个答案:

答案 0 :(得分:-1)

我们在这里看到:

如果您想要一个double来表示像素的RGB(和可选的A)字段,则必须将相应的位范围分开。

首先,让我们创建一个double s数组来表示我们的像素(我们有一个名为_rand的静态RNG):

double[,] vals = new double[500,500];

for (int i = 0; i < 500; i++)
    for (int j = 0; j < 500; j++)
        vals[i, j] = _rand.NextDouble();

接下来,让我们创建我们的位图:

Bitmap bit = new Bitmap(500,500);

现在我们要做的是,将这些双打中的每一个乘以int.MaxValue,并将{8}的低8位分开,blue的中右8位, green的中左8位和red的前8位。 (我们现在不会使用alpha)

alpha

这与32位位图的精确度差不多。每个像素由一个32位数字表示;不是每个像素的每种颜色。

生成样本(随机)输出的完整程序如下(我删除了我们创建的部分并将值存储在for (int i = 0; i < 500; i++) { for (int j = 0; j < 500; j++) { var val = (int) (vals[i, j] * int.MaxValue); var b = (val & 0x000000FF); var g = (val & 0x0000FF00) >> 8; var r = (val & 0x00FF0000) >> 16; //var a = (val & 0xFF000000) >> 24; (this would get you the alpha) //Set the pixel at [i, j] to (r, g, b) bit.SetPixel(i, j, Color.FromArgb(r, g, b)); } } 中并直接进行了计算:

double[,]

据我所知,遗憾的是没有办法避免精度损失,因为位图像素值必须包含32位内的所有信息(显然是32位位图)和{{1}已经比那个大了。如果你想将ARGB存储为4个不同的64位using System; using System.Drawing; namespace BitmapTest { class Program { private static Random _rand = new Random(); private static void Main(string[] args) { Bitmap bit = new Bitmap(500, 500); for (int i = 0; i < 500; i++) { for (int j = 0; j < 500; j++) { var val = (int)(_rand.NextDouble() * int.MaxValue); var b = (val & 0x000000FF); var g = (val & 0x0000FF00) >> 8; var r = (val & 0x00FF0000) >> 16; //var a = (val & 0xFF000000) >> 24; (this would get you the alpha) bit.SetPixel(i, j, Color.FromArgb(r, g, b)); } } bit.Save(@"C:\Temp\img.bmp"); bit.Dispose(); Console.WriteLine("Press any key to continue..."); Console.ReadKey(true); } } } ,你需要一个256位的位图......当然可能存在,但为什么呢?