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