我已经做了一些搜索,我无法找到任何功能多数民众赞成在做什么,我whant它待办事项。
我有一个文本文件扫描的图像文件,但该文件是旋转一定程度,所以我whant这么旋转它的文本彼此是线上。
在一个完美的世界中的应该是全自动这样的功能,但我无法找到任何东西,我明白得到它的工作全自动其需要的是一些分析图像的,我认为它于大事情待办事项什么。
但后来我做了旋转手动将网站上的图像的工具,但现在我需要一个函数来旋转保存到图像文件。
这似乎是对一些方法型动物,但没有一个我测试做什么我whant。
我已经瑶池该功能的工作原理就像我whant是:
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; }
但是,这不改变图像文件的高度和宽度,使图像文件是在相同的尺寸,但图像“对象”已经缩放和旋转。
任何想法如何,我可以做到这一点好?
答案我发现与我的形象,具有在对300的分辨率工作的解决旧的答案在这里 。
如果我理解正确的话您的问题,基本上是要制定出一次旋转图像的新大小,以及如何旋转的图像定位在它的新的位图。
图表希望有助于明确的解决方案。 这是一个有点伪代码:
sinVal = abs(sin(angle))
cosVal = abs(cos(angle))
newImgWidth = sinVal * oldImgHeight + cosVal * oldImgWidth
newImgHeight = sinVal * oldImgWidth + cosVal * oldImgHeight
originX = 0
originY = sinVal * oldImgWidth
你想从newImgWidth和newImgHeight新的图像,然后围绕原点(originX,originY)进行旋转,然后渲染图像这一点。 这将翻倒如果角度(度)是度不与0之间-90(描绘)。 如果它是0到90度之间,那么你只需要改变的由来:
originX = sinVal * oldImgHeight
originY = 0
如果它是在范围90度至270度(-90度),那么它是一个小tricker(见下面实施例的代码)。
您的代码重新编写(简单测试) - 这是稍微躲闪,但似乎工作:
public static Bitmap RotateImg(Bitmap bmp, float angle, Color bkColor)
{
angle = angle % 360;
if (angle > 180)
angle -= 360;
System.Drawing.Imaging.PixelFormat pf = default(System.Drawing.Imaging.PixelFormat);
if (bkColor == Color.Transparent)
{
pf = System.Drawing.Imaging.PixelFormat.Format32bppArgb;
}
else
{
pf = bmp.PixelFormat;
}
float sin = (float)Math.Abs(Math.Sin(angle * Math.PI / 180.0)); // this function takes radians
float cos = (float)Math.Abs(Math.Cos(angle * Math.PI / 180.0)); // this one too
float newImgWidth = sin * bmp.Height + cos * bmp.Width;
float newImgHeight = sin * bmp.Width + cos * bmp.Height;
float originX = 0f;
float originY = 0f;
if (angle > 0)
{
if (angle <= 90)
originX = sin * bmp.Height;
else
{
originX = newImgWidth;
originY = newImgHeight - sin * bmp.Width;
}
}
else
{
if (angle >= -90)
originY = sin * bmp.Width;
else
{
originX = newImgWidth - sin * bmp.Height;
originY = newImgHeight;
}
}
Bitmap newImg = new Bitmap((int)newImgWidth, (int)newImgHeight, pf);
Graphics g = Graphics.FromImage(newImg);
g.Clear(bkColor);
g.TranslateTransform(originX, originY); // offset the origin to our calculated values
g.RotateTransform(angle); // set up rotate
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
g.DrawImageUnscaled(bmp, 0, 0); // draw the image at 0, 0
g.Dispose();
return newImg;
}
注意对于三角函数的度数到弧度转换(180度==裨弧度)
编辑:最大的问题是消极的罪恶值,和我越来越宽度计算原点的x / y时/高度困惑 - 这应该能正常运行,现在(测试)
编辑:修改后的代码,以处理任何角度
这是严格由VisualMelon漂亮的答案上述评论,但我不允许添加评论...
有在代码中两个小虫子
a)该模数后的第一个检查应要么被一分为二,或变更为例如
if (180<Math.Abs(angle)) angle -= 360*Math.Sign(angle);
否则,-360和-180之间的角度会失败,因为只有+180至+360共办理
二)newImg分配刚过,分辨率分配丢失,如
newImg.SetResolution(bmp.HorizontalResolution, bmp.VerticalResolution);
如果忽略如果源不是96 dpi的图像将被缩小。
....和分裂棒,尺寸和偏移的中间计算应该被保存在双重的,只有减少到去年浮动