.NET 在绘制到图形时缩放图像

Posted

技术标签:

【中文标题】.NET 在绘制到图形时缩放图像【英文标题】:.NET scales image when drawing to graphics 【发布时间】:2012-04-29 14:25:41 【问题描述】:

我想制作一个将 png 图像合并为一个 png 的程序。 所有图像都是 78px 高,120px 宽,所以我创建了一个 1200x78 的位图(我需要合并 10 个图像) 它合并,但结果 png 中的每个图像都缩放大约 x2。为什么?

这是我的代码:

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

namespace WindowsFormsApplication1

    public partial class Form1 : Form
    
        OpenFileDialog openFileDialog1;
        Bitmap bitmap;

        public Form1()
        
            InitializeComponent();
            openFileDialog1 = new OpenFileDialog();
            openFileDialog1.Multiselect = true;
            openFileDialog1.Filter =
        "Images (*.PNG;*.JPG;*.GIF)|*.PNG;*.JPG;*.GIF|" +
        "All files (*.*)|*.*";
            openFileDialog1.Title = "Select images to merge";

            bitmap = new Bitmap(1200, 78);
        

        private void button1_Click(object sender, EventArgs e)
        
            DialogResult dr = this.openFileDialog1.ShowDialog();

            if (dr == System.Windows.Forms.DialogResult.OK)
            
                // Read the files
                int shift = 0;
                foreach (String file in openFileDialog1.FileNames)
                
                    // Create a PictureBox.
                    try
                    
                        PictureBox pb = new PictureBox();
                        Image loadedImage = Image.FromFile(file);
                        pb.Height = loadedImage.Height;
                        pb.Width = loadedImage.Width;
                        pb.Image = loadedImage;
                        flowLayoutPanel2.Controls.Add(pb);

                        paintToBitmap(loadedImage, shift);

                        shift += loadedImage.Width;
                    
                    catch (SecurityException ex)
                    
                        //  The user lacks appropriate permissions to read files, discover paths, etc.
                        MessageBox.Show("Security error\n\n" +
                           "Error message: " + ex.Message + "\n\n" +
                            "Details (send to Support):\n\n" + ex.StackTrace
                        );
                    
                    catch (Exception ex)
                    
                        // Could not load the image - probably related to Windows file system permissions.
                        MessageBox.Show("!!!");
                    
                


                saveImage();
            
        

        private void paintToBitmap(Image image, int shift)
                   
            Graphics graphics = Graphics.FromImage(bitmap);
            graphics.DrawImage(image, new Point(shift, 0));
        

        private void saveImage()
        
            bitmap.Save("d:\\result.png", System.Drawing.Imaging.ImageFormat.Png);
        

        private void flowLayoutPanel2_Paint(object sender, PaintEventArgs e)
        

        
    

【问题讨论】:

我运行了你的代码,它似乎工作正常。你能附上你的输入图像之一吗?我猜这是您的图像在 dpi 或类似方面的问题。 files.moonmana.com/forums/m1.pngfiles.moonmana.com/forums/m2.png 【参考方案1】:

尝试将您的代码更新为此

graphics.DrawImage(image, new Rectangle(shift, 0,120,78));

【讨论】:

非常感谢,矩形帮助了,但是第三个参数是宽度,所以它应该只有 120,没有移位。 graphics.DrawImage(image, new Rectangle(shift, 0,120,78));【参考方案2】:

它似乎试图使图片适应您的“粉红狗:P”图像的大小。当你用背景填充图像时,它会以不同的方式产生。看到这个:

所以,问题似乎出在图片的不可见背景上。

【讨论】:

如果您使用填充一种颜色的矩形,您如何知道您的示例有效? :) 你在 0,0 处绘制一个矩形,它的大小从 120 调整到 240,而不是在 120 处绘制下一个矩形,所以它与第一个调整大小的矩形的一部分重叠,依此类推;)

以上是关于.NET 在绘制到图形时缩放图像的主要内容,如果未能解决你的问题,请参考以下文章

使用图像无法正确缩放的绘制视图缩放:Android

Java:JPanel 背景不缩放

在图像视图上绘制矩形。图像无法正确缩放 - iOS

在 ios 的滚动视图中绘制缩放的图像视图?

jscanvas画图放大是文字不变

java缩放图像绘制问题