这是我发布的第一个问题。所以请对我好,但是如何改进我的提问以提高可读性的评论非常受欢迎。
我尝试使用图形旋转一组短裤。
我为图像读取了一系列短路,使用图形旋转它,然后将其存储回一系列短路中。 但是,我遇到图形处理程序没有按预期工作,所以我剥离了我的代码,它看起来像这样:
它首先使用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]。
我试图填充背景,画一个矩形等。 我真的不知道目标位图中的数据不包含来自源图像的数据的原因。图形的准确性是否受到损害?
答案 0 :(得分:0)
在MSDN上,there is a comment声明:
PixelFormat48bppRGB,PixelFormat64bppARGB和PixelFormat64bppPARGB每个颜色分量(通道)使用16位。 GDI +版本1.0和1.1可以读取每通道16位的图像,但是这样的图像被转换为每通道8位格式以进行处理,显示和保存。每个16位颜色通道可以保存0到2 ^ 13范围内的值。
我敢打赌,这就是导致精确度下降的原因。
也许您可以选择Format24bppRgb
并使用每个短片两个像素;它似乎会为您的示例返回正确的结果,同时还要将srcCols
设置为其值的两倍。