Example #1
0
        void OnMemXferEvent(object sender, Twain32.MemXferEventArgs e)
        {
            try
            {
                logger.Debug("On MemXfer Event {0}", this.stream.Position);
                //FIXME Некорректно работает с черно белыми изображениями на нашем сканере(нужно проверить)
                int _bytesPerPixel = e.ImageInfo.BitsPerPixel >> 3;
                for (int i = 0, _rowOffset = 0; i < e.ImageMemXfer.Rows; i++, _rowOffset += (int)e.ImageMemXfer.BytesPerRow)
                {
                    for (int ii = 0, _colOffset = 0; ii < e.ImageMemXfer.Columns; ii++, _colOffset += _bytesPerPixel)
                    {
                        switch (e.ImageInfo.BitsPerPixel)
                        {
                        case 1:
                            for (int _mask = 1; (_mask & 0xff) != 0 && ii < e.ImageMemXfer.Columns; _mask <<= 1, ii++)
                            {
                                this.stream.WriteByte((e.ImageMemXfer.ImageData[_rowOffset + _colOffset] & _mask) != 0?byte.MaxValue:byte.MinValue);
                            }
                            _colOffset++;
                            ii--;
                            break;

                        case 8:
                        case 24:
                            if (e.ImageInfo.PixelType == TwPixelType.Palette)
                            {
                                System.Drawing.Color _color = this.palette.Colors[e.ImageMemXfer.ImageData[_rowOffset + _colOffset]];
                                this.stream.Write(new byte[] { _color.R, _color.G, _color.B }, 0, 3);
                            }
                            else
                            {
                                this.stream.Write(e.ImageMemXfer.ImageData, _rowOffset + _colOffset, _bytesPerPixel);
                            }
                            break;
                        }
                    }
                }
                OnPulse(e.ImageInfo.BitsPerPixel * e.ImageInfo.ImageLength * e.ImageInfo.ImageWidth / 8, (int)stream.Position);
            }
            catch (Exception ex)
            {
                logger.Error(ex, "Ошибка при получении изображения.");
                throw ex;
            }
        }
 private void _twain32_MemXferEvent(object sender, Twain32.MemXferEventArgs e)
 {
     CustomMessageBox.Show("Memory error!", e.ToString(), System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
 }
 private void _MemXferEvent(object sender, Twain32.MemXferEventArgs e)
 {
     this.MemoryTransferCallback?.Invoke(e);
 }