gpt4 book ai didi

c# - 如何在面板 C# 中保持纵横比?

转载 作者:太空宇宙 更新时间:2023-11-03 15:26:43 27 4
gpt4 key购买 nike

我以预览模式保存图像。预览模式包含Picturebox 和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);

和类 StretchImage 来缩放 control(Picturebox, Label)panel。面板中显示的图像在保存后有所不同。

Image in my software

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

最佳答案

将宽高比应用于 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 窗体事件的优点是我们可以防止窗体闪烁。在 .NET 中调整事件大小在应用调整大小之前被调用,因此修改事件中的大小会产生闪烁。

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

试试这个

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);
}

关于c# - 如何在面板 C# 中保持纵横比?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35076457/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com