Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: TWAIN IntPtr забрать изображение используя С#  (Прочитано 6350 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Boriska
Помогающий

us
Offline Offline

« : 15-11-2021 12:53 » 

Привет коллеги.
Разбираю код

0. Инициализация
1. Выбираем источник tw.Select();
2. Опрашиваем tw.Acquire();
3. Возвращаем данные tw.TransferPictures();
4. Данные возвращаются в виде массива IntPtr на изображения.

И тут затык как получить это изображение, точнее два затыка.
1. Первый затык надо бы знать как оно(изображение) устроено и сколько чего скопировать используя
Marshal.Copy тут я поплыл.
2. Второй затык, в примере есть функция сохранения на диск этого изображения
....
st = GdipSaveImageToFile( img, sd.FileName, ref clsid, IntPtr.Zero );
отрабатывает, сохраняет, но держит потом файл и как его отлипнуть ума не приложу.
Записан
Boriska
Помогающий

us
Offline Offline

« Ответ #1 : 16-11-2021 09:36 » 

Есть продвижение. После того как twain вернул IntPtr на картинку, картинку можно вернуть
Код: (C#)
public static Bitmap BitmapFromDIB(IntPtr pDIB)
                {
                        IntPtr pPix = (IntPtr)((int)pDIB + 40);
                        IntPtr pBmp = IntPtr.Zero;
                        int status = GdipCreateBitmapFromGdiDib(pDIB, pPix, ref pBmp);
                        MethodInfo mi = typeof(Bitmap).GetMethod("FromGDIplus", BindingFlags.Static | BindingFlags.NonPublic);
                        Bitmap bmp = (Bitmap)mi.Invoke(null, new object[] { pBmp });
                        if ((status == 0) && (pBmp != IntPtr.Zero)) return bmp;
                        else return null;
                }
После чего засунуть в pictureBox

Добавлено через 23 часа, 2 минуты и 47 секунд:
Чет не то с этой функой, он размер ограничивает передаваемый
« Последнее редактирование: 17-11-2021 08:39 от lkote » Записан
Boriska
Помогающий

us
Offline Offline

« Ответ #2 : 19-11-2021 08:09 » 

Вот так должно быть.
Код: (C#)
        private Bitmap BitmapFromDIB(IntPtr pDIB, IntPtr pPix)
        {
            MethodInfo mi = typeof(Bitmap).GetMethod("FromGDIplus",
                            BindingFlags.Static | BindingFlags.NonPublic);

            if (mi == null)
                return null; // (permission problem)

            IntPtr pBmp = IntPtr.Zero;
            int status = GdipCreateBitmapFromGdiDib(pDIB, pPix, ref pBmp);

            if ((status == 0) && (pBmp != IntPtr.Zero)) // success
                return (Bitmap)mi.Invoke(null, new object[] { pBmp });

            else
                return null; // failure
        }
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines