我从双打数组创建一个位图(对于我从数组中定义颜色的每个像素)。并且由于Color类型只能存储整数值(从0到255),我必须在将数组值存储到Bitmap的颜色值之前将其转换为int或byte。但是,当然,由于转换,我丢失了信息。所以我需要一些方法来存储我的双值来表示图像的颜色,而不会有任何损失。
更新: 问题是Bitmap使用Color类型,它需要一个小范围的整数。有可能以双值形式(例如从0到1)表示颜色并将其存储在图像中。但据我所知,Bitmap并没有提供这个机会。
答案 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位的位图......当然可能存在,但为什么呢?