我正在使用C#中的
当我使用
当我以编程方式检索图像并在代码中写入文件时,我会得到以下结果:
Bitmap
和System.Drawing.Graphics
将多个图像在水平和垂直方向上拼接为一个更大的图像(其总宽度和高度为单个图像的宽度和高度之和)。每个图像的大小为256像素乘以256像素。当我使用
System.Drawing.Graphics
的DrawImage
时,为什么会得到一个缩放或放大后的原始图像?
这是原始图像:
当我以编程方式检索图像并在代码中写入文件时,我会得到以下结果:
var result = httpClient.GetStreamAsync(/* url */);
var bitmap = new Bitmap(await result);
...
using (var memory = new MemoryStream())
{
using (var fs = new FileStream(/* path */, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
bitmap.Save(memory, ImageFormat.Png); // I save to .png if that makes a difference
var bytes = memory.ToArray();
await fs.WriteAsync(bytes, 0, bytes.Length);
}
}
我看不出任何区别。到目前为止,一切顺利。
然而,当我尝试横向拼接图像时,我得到了以下结果:
注意:参考上面的图片,在下面的拼接图像中它在最右边。
它看起来被缩放、放大,绝不像上面原始的或通过编程检索的单个图像。这是我用来拼接图像的代码:
注意:如果byWidth
为true
,则我会水平拼接图像。
private Bitmap MergeImages(IEnumerable<Bitmap> images, bool byWidth)
{
var enumerable = images as IList<Bitmap> ?? images.ToList();
var width = 0;
var height = 0;
foreach (var image in enumerable)
{
if (byWidth)
{
width += image.Width;
height = image.Height;
}
else
{
width = image.Width;
height += image.Height;
}
}
var bitmap = new Bitmap(width, height);
using (var g = Graphics.FromImage(bitmap))
{
var localWidth = 0;
var localHeight = 0;
foreach (var image in enumerable)
{
if (byWidth)
{
g.DrawImage(image, localWidth, 0);
localWidth += image.Width;
}
else
{
g.DrawImage(image, 0, localHeight);
localHeight += image.Height;
}
}
}
return bitmap;
}