[翻译]XNA 3.0 Game Programming Recipes之seventeen

PS:自己翻译的,转载请著明出处
                                             3-7。创建一个纹理,定义每个象素的颜色,保存纹理到一个文件里
问题
     要创建一个新的纹理从无到有,手动定义的颜色每个像素的纹理。这可能是很有用的当您想要让用户创建一个图像或产生人工图像如深的地图或混乱的地图。
     您想保存这个或另一个纹理到一个文件,例如,产生你程序的屏幕截图或者用于调试目的。
解决方案
     设置图像的内容颜色是直接被XNA框架支持,这是你选择一种格式来保存纹理到一个文件中。
     您可以设置和更改的纹理的内容调用纹理SetData方法,它接受包含每个像素的颜色值一个数组。
     您可以保存纹理到一个文件在磁盘上使用其Save的方法。
它是如何工作的
    首先应该创建一个数组,保存图象上每个象素的颜色:
 1 int textureWidth=512;
 2 int textureHight=512;
 3 Color[] textureColors=new Color[textureWidth*textureHeight];
 4 int i=0;
 5 for(int ver=0;ver<textureHeight;ver++)
 6     for(int hor=0;hor<textureWidth;hor++)
 7     {
 8         float red=(float)hor/(float)textureWidth;
 9         float green=0;
10         float blue=(float)ver/(float)textureHeight;
11         float alpha=1;
12         textureColors[i++]=new Color(new Vector4(red,green,blue,alpha));
13     }
   头三行创建一个数组,可以存储纹理的颜色,512*512象素的分辨率。接着,代码填充每个像素分别为使用双精度类型循环。用下面的命令填补,从左上角开始。当增加索引时,像素的扫描从左至右然后从上到下。
   最后,您需要创建实际的纹理和加载的数组转入纹理的内存中内容:
1 Texture2D newTexture=new Texture2D(device,textureWidth,textureHeight,1,TextureUsage.None,SurfaceFormat.Color);
   在图象的设备和解决方案之后,你需要指定你想产生的mipmaps的数量。下一步允许你设置TextureUsage。选择TextureUsage.AutoGenerateMipMap,XNA会自动生成一定数量的你指定的mipmaps。请记住,图象的宽度和高度应prowers of 2,如果你想使用mipmaps的话 。
注意 mipmapped图像包含多个固定的图象。这有利于在大量的情况下。 想像一下你正在绘制的三维场景,以质感方块,以便远离相机,它仅占 一个窗口的单像素。要确定这个颜色的方块,您的显卡仍然会计算它认为正确的纹理坐标上包含什么,谁是纹理着色器。当您将您的相机移动一点,这将可能得到一个细微不同的纹理坐标,这可能符合一个完全不同的 颜色的纹理。其结果是,移动镜头一点点可能造成的方块颜色较大的变化 ,导致屏幕上的像素闪睃,在您的相机移动时。要解决这靠通过存储多个版本的图像中的形象。一个图象是64*64像素,如果你 使用mipmapping ,XNA也将创造一个32*32版本, 16*16版本,一个8*8, 4*4 ,和2*2 到1*1版本内的图像。现在,假设盒子非常远,XNA将使用1*1 mipmap的图象。因此,一个微小变化的位置,仍然会导致相机在不同的 纹理坐标。然而,这种变化纹理坐标不会导致颜色的改变,因为 整个纹理( 1*1像素)具有相同的颜色!这意味着该像素在屏幕上相应的方块现在将保持稳定的色彩。  最后一个参数指定像素在纹理的格式。这是必要的,以便XNA可以分配足够的内存来存储纹理。此外,当检索纹理的值时
,这是你希望的格式,或当您将数据写入纹理正如你在这里做的,您必须提供这种格式的数据。
   最后,你很容易的在纹理中保存Color树组:
1 newTexture.SetData<Color>(textureColors);
   所有的都在这里有,保存一个纹理到文件中非常方便:
1 myTexture.Save("savedtexture.jpg",ImageFileFormat.jpg);
   最后一个参数指定你希望你的文件的格式/压缩。确保扩展名文件名称对应这种格式,或者您可能会遇到麻烦当试图打开该文件用外部图像浏览器。
   当你运行你的代码,该文件将被创建在同一路径作为您的可执行文件。默认情况下,在\bin\x86\Debug map.
代码
 1 //这个方法创建一个纹理,用颜色填充它,在返回它
 2 private Texutre2D DefineTextureColors()
 3 {
 4     int textureWidth=512;
 5     int textureHeight=512;
 6     Color[] textureColors=new Color[textureWidth*textureHeight];
 7     int i=0;
 8     for(int ver=0;ver<textureHeight;ver++)
 9         for(int hor=0;hor<textureWidth;hor++)
10         {
11             textureColors[i++]=new Color(new Vector4((float)hor/(float)textureWidth,0,(float)ver/(float)textureHeight,1));
12         }
13     Texture2D newTexture=new Texture2D(device,textureWidth,textureHeight,1,ResourceUsage.None,SurfaceFormat.Color);
14     newTexture.SetData<Color>(textureColors);
15     return newTexture;
16 }
17 //前面的方法应该调用LoadContent方法,因为它要求该设备初始化:
18 protected override void LoadContent()
19 {
20     device=graphics.GraphicsDevice;
21     spriteBatch=new SpriteBatch(GraphicsDevice);
22     myTexture=DefineTextureColors();
23     myTexture.Save("savedtexture.jpg",ImageFileFormat.jpg);
24 }
原文地址:https://www.cnblogs.com/315358525/p/1531384.html