【发布时间】:2012-12-20 12:26:18
【问题描述】:
我已经进行了一些搜索,但我找不到任何可以做我想做的事情的功能。
我有一个带有文本的扫描文档的图像文件,但该文档旋转了一些度数,所以我想旋转它以使文本彼此内联。
在一个完美的世界中,它应该是一个自动执行此操作的功能,但我找不到任何东西,我知道要让它自动工作,它需要对图像进行一些分析,我认为这是一件大事。
但后来我做了一个工具来手动旋转网站上的图像,但现在我需要一个函数来将旋转保存到图像文件中。
这似乎是一些不同的方法,但我测试过的人没有做我想做的事。
我发现的功能几乎和我想要的一样:
public static Bitmap RotateImg(Bitmap bmp, float angle, Color bkColor) {
int w = bmp.Width;
int h = bmp.Height;
PixelFormat pf = default(PixelFormat);
if (bkColor == Color.Transparent)
{
pf = PixelFormat.Format32bppArgb;
}
else
{
pf = bmp.PixelFormat;
}
Bitmap tempImg = new Bitmap(w, h, pf);
Graphics g = Graphics.FromImage(tempImg);
g.Clear(bkColor);
g.DrawImageUnscaled(bmp, 1, 1);
g.Dispose();
GraphicsPath path = new GraphicsPath();
path.AddRectangle(new RectangleF(0f, 0f, w, h));
Matrix mtrx = new Matrix();
//Using System.Drawing.Drawing2D.Matrix class
mtrx.Rotate(angle);
RectangleF rct = path.GetBounds(mtrx);
Bitmap newImg = new Bitmap(Convert.ToInt32(rct.Width), Convert.ToInt32(rct.Height), pf);
g = Graphics.FromImage(newImg);
g.Clear(bkColor);
g.TranslateTransform(-rct.X, -rct.Y);
g.RotateTransform(angle);
g.InterpolationMode = InterpolationMode.HighQualityBilinear;
g.DrawImageUnscaled(tempImg, 0, 0);
g.Dispose();
tempImg.Dispose();
return newImg; }
但这不会改变图像文件的高度和宽度,因此图像文件大小相同,但图像“对象”已被缩放和旋转。
知道我该怎么做吗?
回答 我在old answer here 找到了适用于我的图像的解决方案,该解决方案的分辨率为 300。
【问题讨论】:
-
您的问题标题有点误导,您真正要问的是如何计算图像旋转后的新宽度/高度,这更像是mathematical 问题而不是编程问题.