В настоящее время я получаю отсканированные страницы через Twain и преобразовываю их в Bitmap
, используя ссылку BitmapRenderer из проекта twaindotnet, как описано в этом опубликовать.
Мой сканер позволяет мне сканировать лицевую и оборотную сторону. Когда я сканирую страницы только лицевой стороны, это работает как шарм: сгенерированные растровые изображения идеальны. Но когда он сканирует лицевую и оборотную сторону, растровое изображение переворачивается. Иногда вертикально, иногда горизонтально.
Я не могу использовать метод Bitmap.RotateFlip()
, потому что эффект не касается каждой картинки, а только когда лицевая-оборотная страницы.
Я пробовал Bitmap.FromHbitmap()
, описанный здесь или конструктор по умолчанию, но он выдает ошибку, связанную с GDI+.
Я почти уверен, что проблема заключается в том, что растровое изображение преобразуется из указателя в классе BitmapRenderer. Вот код (я не включил методы Dispose()
для ясности):
public class BitmapRenderer : IDisposable
{
private readonly IntPtr _picturePointer;
private readonly IntPtr _bitmapPointer;
private readonly IntPtr _pixelInfoPointer;
private Rectangle _rectangle;
private readonly BitmapInfoHeader _bitmapInfo;
/// <summary>
/// Initializes a new instance of the <see cref="BitmapRenderer"/> class.
/// </summary>
/// <param name="picturePointer_">The picture pointer.</param>
public BitmapRenderer(IntPtr picturePointer_)
{
_picturePointer = picturePointer_;
_bitmapPointer = Kernel32Native.GlobalLock(picturePointer_);
_bitmapInfo = new BitmapInfoHeader();
Marshal.PtrToStructure(_bitmapPointer, _bitmapInfo);
_rectangle = new Rectangle();
_rectangle.X = _rectangle.Y = 0;
_rectangle.Width = _bitmapInfo.Width;
_rectangle.Height = _bitmapInfo.Height;
if (_bitmapInfo.SizeImage == 0)
{
_bitmapInfo.SizeImage = ((((_bitmapInfo.Width*_bitmapInfo.BitCount) + 31) & ~31) >> 3)*
_bitmapInfo.Height;
}
// The following code only works on x86
Debug.Assert(Marshal.SizeOf(typeof (IntPtr)) == 4);
int pixelInfoPointer = _bitmapInfo.ClrUsed;
if ((pixelInfoPointer == 0) && (_bitmapInfo.BitCount <= 8))
pixelInfoPointer = 1 << _bitmapInfo.BitCount;
pixelInfoPointer = (pixelInfoPointer*4) + _bitmapInfo.Size + _bitmapPointer.ToInt32();
_pixelInfoPointer = new IntPtr(pixelInfoPointer);
}
/// <summary>
/// Renders to bitmap.
/// </summary>
/// <returns></returns>
public Bitmap RenderToBitmap()
{
Bitmap bitmap = new Bitmap(_rectangle.Width, _rectangle.Height);
using (Graphics graphics = Graphics.FromImage(bitmap))
{
IntPtr hdc = graphics.GetHdc();
try
{
Gdi32Native.SetDIBitsToDevice(hdc, 0, 0, _rectangle.Width, _rectangle.Height,
0, 0, 0, _rectangle.Height, _pixelInfoPointer, _bitmapPointer, 0);
}
finally
{
graphics.ReleaseHdc(hdc);
}
}
bitmap.SetResolution(PpmToDpi(_bitmapInfo.XPelsPerMeter), PpmToDpi(_bitmapInfo.YPelsPerMeter));
return bitmap;
}
private static float PpmToDpi(double pixelsPerMeter_)
{
double pixelsPerMillimeter = pixelsPerMeter_/1000.0;
double dotsPerInch = pixelsPerMillimeter*25.4;
return (float) Math.Round(dotsPerInch, 2);
}
Я не понимаю, откуда это и как это решить.
РЕДАКТИРОВАТЬ
Похоже, эта ситуация не связана с twain преобразование в растровое изображение (вообще проблема не в проекте twaindotnet).
Это происходит только с рукописными страницами. Это проблема автоматического распознавания текста. Кто-нибудь знает, как отключить OCR для рукописного документа?