如何保持C#面板的宽高比?

时间:2016-01-29 03:39:10

标签: c#

我以预览模式保存图像。预览模式包含Picturebox and Label控件。

问题出在我保存图像的时候。可能我录制了我的屏幕。

导出图像与我的预期不同,它不保持宽高比。 因此,保存到example.jpg后面板中的所有控件都将出错位置。

我的代码用于ScaleImage:

public static Image ScaleImage(Image image, int maxWidth, int maxHeight)
{
    var ratioX = (double) maxWidth/image.Width;
    var ratioY = (double) maxHeight/image.Height;
    var ratio = Math.Min(ratioX, ratioY);

    var newWidth = (int) (image.Width*ratio);
    var newHeight = (int) (image.Height*ratio);

    var newImage = new Bitmap(newWidth, newHeight);
    Graphics.FromImage(newImage).DrawImage(image, 0, 0, newWidth, newHeight);
    return newImage;
}

我的代码保存图片:

Graphics g = Graphics.FromImage(img);
string s = lstImgAdded.Items[k].Text;
Bitmap bm = new Bitmap(@"" + s);
panel2.BackgroundImage = bm;
PointF p1 = StretchImageSize(postPoint, panel2);
g.DrawImage(
    DrawText(lstAliasImage[i - valuesFrom], fontType, colorInput,
        Color.Transparent),
    Point.Round(StretchImageSize(postPoint, panel2))); // Point.Round(StretchImageSize(postPoint, panel2)) ở đây dùng nhìu lần

g.DrawImage(ctrl.Image, Point.Round(StretchImageSize(postPointPicturebox, panel2)).X, Point.Round(StretchImageSize(postPointPicturebox, panel2)).Y,
    ctrl.Width, ctrl.Height); // panel2 có phải cái hình nhỏ ko? ko. picturebox moi la nho, panel la background lon


g.Dispose();
string linkLocation = txtAddress.Text;
ScaleImage(img, witdhImg, heightImg)
    .Save(linkLocation + "\\" + lstAliasImage[i - valuesFrom] + "." + imgType,
        ImageFormat.Jpeg);

使用StretchImagecontrol(Picturebox, Label)分级为a panel。 保存后面板中图像之前的图像显示不同。

Image in my software

在我的软件中,图片显示在面板中。它不像Preview software那样缩放: After in save in my computer

1 个答案:

答案 0 :(得分:0)

将宽高比应用于Windows窗体

Much like we intercepted Windows message in our Windows 7 Style Form, to keep the aspect ratio of a Windows Form we are going to intercept the resizing Windows messages. This is done by overriding WndProc.

Here is a list of the constants that we need for this algorithm:

WM_SIZING = 0x214
WMSZ_LEFT = 1
WMSZ_RIGHT = 2
WMSZ_TOP = 3
WMSZ_BOTTOM = 6
  1. 第一个是我们的C#应用​​程序在表单时可以分辨的方式 正在调整大小。其余的常数告诉我们究竟是哪一个 表格的一面正在调整大小。请注意,对于边角 结合。因此,例如,左下角将调整大小 表格的右下部分因此是2 + 6 = 8。

  2. 使用WndProc而不是Windows Form事件的优点是 我们可以防止表格闪烁。调整.NET中的事件大小 在调整大小后应调用,因此进行修改 事件中的大小会产生闪烁。

  3. 确保下载示例C#应用程序。请注意没有 在你调整表格大小的地方,纵横比是 保持。快速查看源代码,可以看出如何 高度或宽度根据表格的哪一侧进行调整 正在调整大小。另一个很酷的事情是表格仍然可以 最大化,可以毫无问题地填满整个屏幕。
  4. 试试这个

    public void ResizeImage(string OriginalFile, string NewFile, int NewWidth, int MaxHeight, bool OnlyResizeIfWider)
    {
    System.Drawing.Image FullsizeImage = System.Drawing.Image.FromFile(OriginalFile);
    // Prevent using images internal thumbnail
    FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
    FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
    if (OnlyResizeIfWider)
    {
    if (FullsizeImage.Width  MaxHeight)
    {
    // Resize with height instead
    NewWidth = FullsizeImage.Width * MaxHeight / FullsizeImage.Height;
    NewHeight = MaxHeight;
    }
    System.Drawing.Image NewImage = FullsizeImage.GetThumbnailImage(NewWidth, NewHeight, null, IntPtr.Zero);
    // Clear handle to original file so that we can overwrite it if necessary
    FullsizeImage.Dispose();
    // Save resized picture
    NewImage.Save(NewFile);
    }