C# 如何从两个图像中创建一个图像?
我想创造新的形象,这两个将是并排的。 如果我有4张图片,那么制作一张新的图片,里面有4张图片。 不是一个在另一个上面,而是两个图像,一个在另一个附近,或者如果是4个图像,那么每个图像也在另一个附近 到目前为止,我所做的是从两幅图像中提取像素:C# 如何从两个图像中创建一个图像?,c#,winforms,C#,Winforms,我想创造新的形象,这两个将是并排的。 如果我有4张图片,那么制作一张新的图片,里面有4张图片。 不是一个在另一个上面,而是两个图像,一个在另一个附近,或者如果是4个图像,那么每个图像也在另一个附近 到目前为止,我所做的是从两幅图像中提取像素: private void GetPixels(string File1, string File2) { Bitmap bmp1 = new Bitmap(File1); Bitmap bmp
private void GetPixels(string File1, string File2)
{
Bitmap bmp1 = new Bitmap(File1);
Bitmap bmp2 = new Bitmap(File2);
for (int i = 0; i < bmp1.Width; i++)
{
for (int j = 0; j < bmp1.Height; j++)
{
Color pixel = bmp1.GetPixel(i, j);
}
}
for (int x = 0; x < bmp2.Width; x++)
{
for (int y = 0; y < bmp2.Height; y++)
{
Color pixel = bmp1.GetPixel(x, y);
}
}
}
private void GetPixels(字符串文件1、字符串文件2)
{
位图bmp1=新位图(文件1);
位图bmp2=新位图(文件2);
对于(int i=0;i
我想创建一个新的位图,它的大小要大到足以存储另外两个位图。
如何计算新位图的正确大小,使其包含其他两个位图
如何将像素添加到新位图中
编辑**
将其添加到名称空间及其ok下Form1的顶层。
现在我试着这样使用它:
private void CreateNewImage()
{
for (int i = 0; i < imagesRainUrls.Count; i++)
{
//Use it
//Double the same image
Bitmap doubledBitmap = imagesRainUrls[i].DoubleBitmap();
//Append new image
Bitmap appendedBitmap = imagesRainUrls.AppendBitmap(imagesSatelliteUrls[i]);
}
}
private void CreateNewImage()
{
对于(int i=0;i
imagesRainUrls是图像列表,ImagesAssetLiteUrls也是图像列表
我得到的错误是:
错误1“字符串”不包含“DoubleBitmap”的定义,并且最佳扩展方法重载“DownloadImages.BitmapExtensions.DoubleBitmap(System.Drawing.Bitmap)”具有一些无效参数
错误2实例参数:无法从“字符串”转换为“System.Drawing.Bitmap”
错误3“System.Collections.Generic.List”不包含“AppendBitmap”的定义,最佳扩展方法重载“DownloadImages.BitmapExtensions.AppendBitmap(System.Drawing.Bitmap,System.Drawing.Bitmap)”具有一些无效参数
错误4实例参数:无法从“System.Collections.Generic.List”转换为“System.Drawing.Bitmap”
错误5参数2:无法从“字符串”转换为“System.Drawing.Bitmap”
而且我在imagesRainUrls列表中有更多的图像,然后是SatelliteUrls列表,那么我如何才能使它合并这两个图像,直到得到SatelliteUrls图像的数量?
雨水图像我有62张,卫星图像只有9张
在这个过程的最后,我将从合并的和未合并的所有gif制作动画gif。因此,动画将是一个gif与前9个图像合并,其余的雨将不会合并,但相同的动画
既然我的雨水图像比卫星图像多,所以我只需要合并9幅图像,那么我如何使用FOR循环呢。你可以使用
图形。FromImage
方法获取图像的图形
,然后使用该对象的方法在图像上绘制所有内容:
public static class BitmapExtensions {
public static Bitmap DoubleBitmap(this Bitmap bm){
Bitmap bitmap = new Bitmap(bm.Width * 2, bm.Height);
using(Graphics g = Graphics.FromImage(bitmap)){
Rectangle rect = new Rectangle(Point.Empty, bm.Size);
g.DrawImage(bm, rect);
rect.Offset(bm.Width,0);
g.DrawImage(bm, rect);
return bitmap;
}
}
public static Bitmap AppendBitmap(this Bitmap bm, Bitmap rightBitmap){
Bitmap bitmap = new Bitmap(bm.Width + rightBitmap.Width, Math.Max(bm.Height, rightBitmap.Height));
using(Graphics g = Graphics.FromImage(bitmap)){
Rectangle rect = new Rectangle(Point.Empty, bm.Size);
g.DrawImage(bm, rect);
rect = new Rectangle(new Point(bm.Width, 0), rightBitmap.Size);
g.DrawImage(rightBitmap, rect);
return bitmap;
}
}
}
//Use it
//Double the same image
Bitmap doubledBitmap = yourBitmap.DoubleBitmap();
//Append new image
Bitmap appendedBitmap = yourBitmap.AppendBitmap(yourSecondBitmap);
注意,像这样在循环中使用GetPixel速度非常慢。使用DrawImage方法可以更快地将像素从一个位图复制到另一个位图。可能是@David的重复我不知道你为什么说依赖图形更快。根据我的经验,这要慢得多。这里有一个我参与的答案(虽然没有提供解决方案),就是抱怨图形太慢(并且提出了一个更快的解决方案):。此外,我还对King King代码与getpixel/setpixel one进行了快速测试,测试过程相同,set/get one速度更快(速度不是太快,但图片很小)。@David我已经做了进一步测试,我必须纠正我之前的说法:在这种特定情况下(使用King King代码),DrawImage速度更快;显然,加载/保存图像的事实对其性能有很大影响(不在set/get中),这就是为什么我的测试结果会因特定条件而发生明显变化的原因。您的imagesRainUrls[i]
是string
,它不能使用DoubleBitmap
,您的imagesRainUrls
是一个列表
,因此它不能同时使用AppendBitmap
。请注意,我将其命名为AppendBitmap
,并不意味着您可以使用它将一些位图附加到集合中,它只能用于位图
,其他类型的任何实例上都没有。我收到一个错误两个错误一个在DoubleBitmap上,一个在AppendBitmap上两个错误都是相同的:错误1扩展方法必须在顶级静态类中定义;BitmapExtensions是一个嵌套类。如何解决?@user2760148扩展类应该放在顶级作用域中(在某个名称空间下),不要放在任何其他类中。好的,现在解决了。我尝试使用它并得到一些错误。正在更新我的问题以及我如何使用它。刚刚更新了我的问题。很抱歉