求教C#中大图拼接方法

lyjxrw1990 2013-08-27 01:13:56
我想把76*76张256*256像素的图片拼成一张大图。
我的想法是1、按列拼成76张宽256,高256*76的图,2、再将这76章图拼在一起。
现在第一步代码如下。出现的问题总是这2个:1、BitmapData newBD = newMap.LockBits(new Rectangle(0, 0, maxW, firstH + secondH), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);这句显示内存不足;2、第1个问题前一句:newMap = new Bitmap(maxW, firstH + secondH);参数无效。
请各位帮助。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace 图片拼接
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string[,] picID = new string[76, 76];
Bitmap[,] pics = new Bitmap[76, 76];
Bitmap[] bbb = new Bitmap[76];
string path = "D:\\编程实验\\62535\\";
private void button1_Click(object sender, EventArgs e)
{
Bitmap firstmap = null;
Bitmap secondmap = null;
for (int i = 0; i < 76; i++)
{
//初始化第一张图、、、、、、、、、、、、、、、、、、、、、、、、
string FullName1 = path + picID[i, 0] + ".jpg";
FileInfo fi1 = new FileInfo(FullName1);
if (fi1.Length < 50) //fillinfo.length的单位是字节
{
//将空的图补充为黑底图
Bitmap newmap = new Bitmap(256, 256);
Graphics g = Graphics.FromImage(newmap);
//清除画布,背景设置为黑色
g.Clear(System.Drawing.Color.Black);
g.Dispose();
newmap.Save(FullName1);
}
pictureBox1.Image = Image.FromFile(FullName1);
firstmap = new Bitmap(pictureBox1.Image);
//初始化第一张图、、、、、、、、、、、、、、、、、、、、、、、、

for (int j = 0; j < 76; j++)
{
//初始化第二张图、、、、、、、、、、、、、、、、、、、、、、、、
string FullName2 = path + picID[i, j] + ".jpg";
FileInfo fi2 = new FileInfo(FullName2);
if (fi2.Length < 50) //fillinfo.length的单位是字节
{
//将空的图补充为黑底图
Bitmap newmap = new Bitmap(256, 256);
Graphics g = Graphics.FromImage(newmap);
//清除画布,背景设置为黑色
g.Clear(System.Drawing.Color.Black);
g.Dispose();
newmap.Save(FullName2);
}
pictureBox2.Image = Image.FromFile(FullName2);
secondmap = new Bitmap(pictureBox2.Image);
//初始化第二张图、、、、、、、、、、、、、、、、、、、、、、、、


Bitmap aaa = MergeImageVertical(secondmap, firstmap);
firstmap = aaa;
}
Bitmap result = firstmap;
firstmap = null;
secondmap = null;
if (result != null)
{
result.Save(path + (25266 + i).ToString() + ",9383.png", System.Drawing.Imaging.ImageFormat.Png);
}
result = null;
//MessageBox.Show(i.ToString());
}
MessageBox.Show("finish!");
}

private void Form1_Load(object sender, EventArgs e)
{
for (int i = 0; i < 76; i++)
{
for (int j = 0; j < 76; j++)
{
picID[i, j] = (25266 + i).ToString() + "," + (9383 + j).ToString();
}
}
}

/// <summary>
/// 将两张图片沿垂直方向进行拼接
/// </summary>
/// <param name="firstMap"></param>
/// <param name="secondMap"></param>
/// <returns></returns>
private Bitmap MergeImageVertical(Bitmap firstMap, Bitmap secondMap)
{
Bitmap newMap = null;
int firstW, firstH, secondW, secondH;
firstW = firstMap.Width;
firstH = firstMap.Height;
secondW = secondMap.Width;
secondH = secondMap.Height;

BitmapData firstBD =
firstMap.LockBits(new Rectangle(0, 0, firstW, firstH),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
BitmapData secondBD =
secondMap.LockBits(new Rectangle(0, 0, secondW, secondH),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

int firstStride = firstBD.Stride;
int secondStride = secondBD.Stride;
System.IntPtr firstScan0 = firstBD.Scan0;
System.IntPtr secondScan0 = secondBD.Scan0;

int maxW = firstW;
if (maxW < secondW)
maxW = secondW;
newMap = new Bitmap(maxW, firstH + secondH);
BitmapData newBD =
newMap.LockBits(new Rectangle(0, 0, maxW, firstH + secondH),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
System.IntPtr newScan0 = newBD.Scan0;
unsafe
{
int newMapStride = newBD.Stride;
byte* pFirst = (byte*)(void*)firstScan0;
byte* pSecond = (byte*)(void*)secondScan0;
byte* pNew = (byte*)(void*)newScan0;
int x, y, temp3W, tempYStride, tempYNewMapStride;
byte temp1;
//写入上边图像
temp3W = 3 * firstW;
for (y = 0; y < firstH; y++)
{
tempYStride = y * firstStride;
tempYNewMapStride = y * newMapStride;
for (x = 0; x < temp3W; x++)
{
temp1 = pFirst[x + tempYStride];
pNew[x + tempYNewMapStride] = temp1;
}
}

//写入下边图像
temp3W = 3 * secondW;
for (y = 0; y < secondH; y++)
{
tempYStride = y * secondStride;
tempYNewMapStride = (y + firstH) * (newMapStride);
for (x = 0; x < temp3W; x++)
{
temp1 = pSecond[x + tempYStride];
pNew[x + tempYNewMapStride] = temp1;
}
}
newMap.UnlockBits(newBD);
}

firstMap.UnlockBits(firstBD);
secondMap.UnlockBits(secondBD);

return newMap;
}
}
}
...全文
306 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ching126 2014-12-08
  • 打赏
  • 举报
回复
大神,左右拼接为什么总是重复的呢
卧_槽 2013-09-10
  • 打赏
  • 举报
回复
要么上x64,要么自己创建硬盘缓存文件然后写入做成bmp,最后想办法转码成为jpg或png。
lyjxrw1990 2013-08-27
  • 打赏
  • 举报
回复
放到64位系统的机器上运行就没有问题了!!!
lyjxrw1990 2013-08-27
  • 打赏
  • 举报
回复
自己定一下,希望能有满意的回答
lyjxrw1990 2013-08-27
  • 打赏
  • 举报
回复
引用 1 楼 laviewpbt 的回复:
又是这种问题,回答了腻了。
高手给个意见呗,我看你在这个帖子里http://bbs.csdn.net/topics/390553867?page=1#post-395334080说:“系统无法为你分配那么大的连续内存。”那应该怎么办呢?您还有在什么地方有回答?
laviewpbt 2013-08-27
  • 打赏
  • 举报
回复
又是这种问题,回答了腻了。

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧