图形未定义绘图到目标位图C#

时间:2016-05-24 14:28:15

标签: c# graphics bitmap drawing

这是我发布的第一个问题。所以请对我好,但是如何改进我的提问以提高可读性的评论非常受欢迎。

我尝试使用图形旋转一组短裤。

我为图像读取了一系列短路,使用图形旋转它,然后将其存储回一系列短路中。 但是,我遇到图形处理程序没有按预期工作,所以我剥离了我的代码,它看起来像这样:

它首先使用Marshal.Copy()将一个简单的短裤数组(source48)复制到src Bitmap。

   short[] source48= new short[]{255,255,255,2,2,2,5,5,5];
   int srcCols=3,int srcRows=1;
   Drawing.Bitmap srcImage = new Drawing.Bitmap(srcCols,srcRows, System.Drawing.Imaging.PixelFormat.Format48bppRgb);   
   System.Drawing.Imaging.BitmapData data = srcImage.LockBits(
                new Drawing.Rectangle(0, 0, srcCols, srcRows),
                System.Drawing.Imaging.ImageLockMode.WriteOnly,
                System.Drawing.Imaging.PixelFormat.Format48bppRgb);
   // Copy the source buffer to the bitmap
   Marshal.Copy(source48, 0, data.Scan0, source48.Length);
   // Unlock the bitmap of the input image again.
   srcImage.UnlockBits(data);
   data = null;             

比它创建一个新的位图" rotateImage"并填充" rotateImage"使用" srcImage"使用图形(我现在跳过实际轮换)

  Drawing.Bitmap rotatedImage = new drawing.Bitmap(srcCols,srcRows,System.Drawing.Imaging.PixelFormat.Format48bppRgb);
  rotatedImage.SetResolution(srcImage.HorizontalResolution, srcImage.VerticalResolution);
  using (Drawing.Graphics g = Drawing.Graphics.FromImage(rotatedImage))
  {
        g.Clear(Drawing.Color.Black);
        g.DrawImage(srcImage, 0, 0);
  }

然后我从"旋转"图像原始数据中读取。

 data = rotatedImage.LockBits(
                new Drawing.Rectangle(0, 0, srcCols, srcRows),
                System.Drawing.Imaging.ImageLockMode.ReadOnly,
                System.Drawing.Imaging.PixelFormat.Format48bppRgb);
 // Copy the bulk from the output image bitmap to a 48bppRGB buffer
 short[] destination48 = new short[9];
 Marshal.Copy(data.Scan0, destination48, 0, destination48.Length);

不幸的是,我发现目的地48充满了{252,252,252,2,2,2,5,5,5];而不是预期的:[255,255,255,2,2,2,5,5,5]。

我试图填充背景,画一个矩形等。 我真的不知道目标位图中的数据不包含来自源图像的数据的原因。图形的准确性是否受到损害?

1 个答案:

答案 0 :(得分:0)

在MSDN上,there is a comment声明:

  

PixelFormat48bppRGB,PixelFormat64bppARGB和PixelFormat64bppPARGB每个颜色分量(通道)使用16位。 GDI +版本1.0和1.1可以读取每通道16位的图像,但是这样的图像被转换为​​每通道8位格式以进行处理,显示和保存。每个16位颜色通道可以保存0到2 ^ 13范围内的值。

我敢打赌,这就是导致精确度下降的原因。

也许您可以选择Format24bppRgb并使用每个短片两个像素;它似乎会为您的示例返回正确的结果,同时还要将srcCols设置为其值的两倍。