c# 图片切割加工再合并,怎么实现

lihui_life 2014-05-26 09:05:08
具体需求是这样的, 机器控制喷印机喷印图片时由于是两个喷头或3个喷头,每个喷头喷印特别的宽度区域,喷头与喷头喷印衔接处存在吹掉几像素的情况(目前厂家无法解决),我们就想把吃掉的这几像素通过图片切割的方式补上,这样喷印时吃掉的这几像素正好是补上的那几个像素,喷印的图片就是完整的了,各位大神有没有好的解决方案或代码呢? 求救!!!
...全文
256 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lihui_life 2014-05-26
  • 打赏
  • 举报
回复
引用 3 楼 jimil 的回复:
可以实现 切割
public void CutToF(Stream stream)
            {
                Image initImage = Image.FromStream(stream, true);
                if (initImage.Width <= 480 && initImage.Height <= 480)
                {
                    initImage.Save("D://test.jpg", ImageFormat.Jpeg);
                }
                else
                {
                    int initWidth = initImage.Width;
                    int initHeight = initImage.Height;
                    if (initWidth != initHeight)
                    {
                        Image pickedImage = null;
                        Graphics pickedG = null;
                        if (initWidth > initHeight)
                        {
                            pickedImage = new Bitmap(initHeight, initHeight);
                            pickedG = Graphics.FromImage(pickedImage);
                            pickedG.InterpolationMode = InterpolationMode.HighQualityBicubic;
                            pickedG.SmoothingMode = SmoothingMode.HighQuality;
                            Rectangle fromR = new Rectangle(0, 0, initHeight, initHeight);//(initWidth - initHeight) / 2
                            Rectangle toR = new Rectangle(0, 0, initHeight, initHeight);
                            pickedG.DrawImage(initImage, fromR);
                            pickedImage.Save("D://jpg//test2.jpg");
                            initWidth = initHeight;
                        }
                        initImage = (Image)pickedImage.Clone();
                        pickedG.Dispose();
                        pickedImage.Dispose();
                        initImage.Save("D://jpg//test1.jpg");

                    }
                    Image resultImage = new Bitmap(150, 150);
                    Graphics resultG = Graphics.FromImage(resultImage);
                    resultG.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    resultG.SmoothingMode = SmoothingMode.HighQuality;
                    resultG.Clear(Color.White);
                    resultG.DrawImage(initImage, new Rectangle(0, 0, 100, 100), new Rectangle(0, 0, initWidth, initHeight), GraphicsUnit.Pixel);
                    ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
                    ImageCodecInfo ici = null;
                    foreach (ImageCodecInfo item in icis)
                    {
                        if (item.MimeType == "image/jpeg" || item.MimeType == "image/bmp" || item.MimeType == "image/png" || item.MimeType =="image/gif")
                        {
                            ici = item;
                        }
                    }
                    EncoderParameters ep = new System.Drawing.Imaging.EncoderParameters(1);
                    ep.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)100);
                    resultImage.Save("D://jpg//test.jpg", ici, ep);
                    ep.Dispose();
                    resultG.Dispose();
                    resultImage.Dispose();
                    initImage.Dispose();
                }
            }             
合并 http://hi.baidu.com/penny_liu/item/1a879cf6bf18344b932af2df 但你必须得知道长多少宽多少,切割的点在哪里,如果这个都不知道,那神也没办法。
大神 你这个貌似并没有切割啊,我刚才运行了你的代码 发现图片缩放了 没有切割。。。 另外切割点我们是知道的 12.7 毫米,长度不限制
jimil 2014-05-26
  • 打赏
  • 举报
回复
可以实现 切割
public void CutToF(Stream stream)
            {
                Image initImage = Image.FromStream(stream, true);
                if (initImage.Width <= 480 && initImage.Height <= 480)
                {
                    initImage.Save("D://test.jpg", ImageFormat.Jpeg);
                }
                else
                {
                    int initWidth = initImage.Width;
                    int initHeight = initImage.Height;
                    if (initWidth != initHeight)
                    {
                        Image pickedImage = null;
                        Graphics pickedG = null;
                        if (initWidth > initHeight)
                        {
                            pickedImage = new Bitmap(initHeight, initHeight);
                            pickedG = Graphics.FromImage(pickedImage);
                            pickedG.InterpolationMode = InterpolationMode.HighQualityBicubic;
                            pickedG.SmoothingMode = SmoothingMode.HighQuality;
                            Rectangle fromR = new Rectangle(0, 0, initHeight, initHeight);//(initWidth - initHeight) / 2
                            Rectangle toR = new Rectangle(0, 0, initHeight, initHeight);
                            pickedG.DrawImage(initImage, fromR);
                            pickedImage.Save("D://jpg//test2.jpg");
                            initWidth = initHeight;
                        }
                        initImage = (Image)pickedImage.Clone();
                        pickedG.Dispose();
                        pickedImage.Dispose();
                        initImage.Save("D://jpg//test1.jpg");

                    }
                    Image resultImage = new Bitmap(150, 150);
                    Graphics resultG = Graphics.FromImage(resultImage);
                    resultG.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    resultG.SmoothingMode = SmoothingMode.HighQuality;
                    resultG.Clear(Color.White);
                    resultG.DrawImage(initImage, new Rectangle(0, 0, 100, 100), new Rectangle(0, 0, initWidth, initHeight), GraphicsUnit.Pixel);
                    ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
                    ImageCodecInfo ici = null;
                    foreach (ImageCodecInfo item in icis)
                    {
                        if (item.MimeType == "image/jpeg" || item.MimeType == "image/bmp" || item.MimeType == "image/png" || item.MimeType =="image/gif")
                        {
                            ici = item;
                        }
                    }
                    EncoderParameters ep = new System.Drawing.Imaging.EncoderParameters(1);
                    ep.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)100);
                    resultImage.Save("D://jpg//test.jpg", ici, ep);
                    ep.Dispose();
                    resultG.Dispose();
                    resultImage.Dispose();
                    initImage.Dispose();
                }
            }             
合并 http://hi.baidu.com/penny_liu/item/1a879cf6bf18344b932af2df 但你必须得知道长多少宽多少,切割的点在哪里,如果这个都不知道,那神也没办法。
lihui_life 2014-05-26
  • 打赏
  • 举报
回复
么人吗?
lihui_life 2014-05-26
  • 打赏
  • 举报
回复
大神们 ,在线求方案或代码
lihui_life 2014-05-26
  • 打赏
  • 举报
回复
引用 5 楼 jimil 的回复:
哦,不好意思,我给代码可能没说明,我来说一下好了,上面有一句: Rectangle fromR = new Rectangle(0, 0, initHeight, initHeight);//(initWidth - initHeight) / 2 这段即是,即截取一个矩形区域。
明白了大致意思 这是我精简后的代码 public void CutToF(Stream stream) { Image initImage = Image.FromStream(stream, true); if (initImage.Width <= 5 && initImage.Height <= 5) { initImage.Save("D://test.jpg", ImageFormat.Bmp); } else { int initWidth = initImage.Width; int initHeight = initImage.Height; Image pickedImage = null; Graphics pickedG = null; pickedImage = new Bitmap(initHeight, 156); pickedG = Graphics.FromImage(pickedImage); pickedG.InterpolationMode = InterpolationMode.HighQualityBicubic; pickedG.SmoothingMode = SmoothingMode.HighQuality; Rectangle fromR = new Rectangle(0, 0, initHeight, initHeight);//绘制原始画布 Rectangle toR = new Rectangle(0,0, initHeight, 156);//需要选取的画布 pickedG.DrawImage(initImage, fromR, toR, GraphicsUnit.Pixel); pickedImage.Save("D://jpg//test2.jpg"); //initWidth = initHeight; //initImage = (Image)pickedImage.Clone(); pickedG.Dispose(); pickedImage.Dispose(); //initImage.Save("D://jpg//test1.jpg"); } } 发现有一个问题 就是 比如一张 312*312 的图片,我如果第一次剪裁 上面的半部分 312*156像素,第二次再剪裁下面,发现下面的达不到底边,两张无法合成为一张完整的图片, 代码逻辑如下 取上部分: Rectangle fromR = new Rectangle(0, 0, initHeight, initHeight);//绘制原始画布 Rectangle toR = new Rectangle(0,0, initHeight, 156);//需要选取的画布 pickedG.DrawImage(initImage, fromR, toR, GraphicsUnit.Pixel); 取下部分 Rectangle fromR = new Rectangle(0, 0, initHeight, initHeight);//绘制原始画布 Rectangle toR = new Rectangle(0,157, initHeight, 156);//需要选取的画布 pickedG.DrawImage(initImage, fromR, toR, GraphicsUnit.Pixel); 难道有错误?
jimil 2014-05-26
  • 打赏
  • 举报
回复
哦,不好意思,我给代码可能没说明,我来说一下好了,上面有一句: Rectangle fromR = new Rectangle(0, 0, initHeight, initHeight);//(initWidth - initHeight) / 2 这段即是,即截取一个矩形区域。

110,536

社区成员

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

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

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