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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Windows Paint -> Clipboard -> gdi+ Bitmap смещение цветов  (Прочитано 11039 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« : 29-10-2012 13:39 » 

Собственно всё по теории:
Код: (C++)
...
        ::OpenClipboard(NULL);

        HGLOBAL hGlobal = ::GetClipboardData(CF_DIB);
        if(hGlobal)
        {
                LPBITMAPINFO lpBI = (LPBITMAPINFO)GlobalLock(hGlobal) ;

                void* pDIBBits = (void*)(lpBI+1);
                Bitmap gdipbmp(lpBI, pDIBBits);

                CLSID pngClsid;
                GetEncoderClsid(_T("image/bmp"), &pngClsid);
                gdipbmp.Save(path, &pngClsid, NULL);
                ...
        }
        ::CloseClipboard();
...

Рисуем в Paint красный, например, квадрат. Выделяем, копируем, сохраняем кодом в файл. А он зелёный. Заменяем Paint на PhotoShop. Повторяем. Квадрат красный.  Здесь была моя ладья...  А черт его знает...
Ну те понятно, что данные у них отличаются, но ведь в обоих случаях это CF_DIB.
Может кто сталкивался?
« Последнее редактирование: 29-10-2012 13:40 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 29-10-2012 14:04 » 

пол-литра разная ? )

дампы бы файлов посмотреть
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #2 : 29-10-2012 14:27 » 

Лёш, ну допустим. А смысл? Есть в буфере некая инфа типа CF_DIB. Теоретически, абсолютно неважно кто её туда поместил, и не должно быть никакой разницы в результате использования этой инфы. Практически же получается, что она есть. Paint я переделать не могу, эт факт. Вычитывать кто именно поместил и делать для КАЖДОЙ проги свою логику? Бред.

Интуиция подсказывает, что это должно быть что-то очень простое. Кстати, если вставляю в фотошоп, то квадрат красный. Понятно, что он это делает не через gdi+. А дампы... Ну сравнивал я их. Ну разные они ессно. И шо? К решению это не подталкивает. Шеф тоже в отчаянии начал смещение менять. На +3 получили синий цвет, да ещё кучу артефактов по краям.

Я просто думаю, что это грабли, и кто-нить наверняка уже наступал. А времени, рассмотреть эти грабли под микроскопом, не хватает.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 29-10-2012 15:48 » 

Не встречал. Встречал, когда красный и синий местами преставлены - приятно смотрится синюшный Кремль на фоне кровавого неба Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
zubr
Гость
« Ответ #4 : 29-10-2012 16:11 » 

Джон, сделай по другому:
1. Получаем HBITMAP: GetClipboardData(CF_BITMAP);
2. Создаем битмап: Bitmap(HBITMAP hbm, HPALETTE hpal); где hpal - NULL
Остальное как у тебя в коде.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 29-10-2012 16:27 » 

Попробовал, не прокатило. Судя по всему gdi+ так не любит. Bitmap создаётся с ошибкой lastResult = InvalidParameter Жаль

ps да, забыл с CF_BITMAP уже GetClipboardData вылетает, а с CF_DIB так не любит.
« Последнее редактирование: 29-10-2012 16:33 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zubr
Гость
« Ответ #6 : 29-10-2012 17:42 » 

Джон, все работает, вот мой код:
Код:
::OpenClipboard(m_hWnd);
HANDLE hc = ::GetClipboardData(CF_BITMAP);
CLSID encoderClsid;
GetEncoderClsid(_T("image/bmp"), &encoderClsid);
Bitmap b ((HBITMAP)hc, NULL);
b.Save(_T("d:\\1.bmp"), &encoderClsid);
Не хочет работать если хендл окна не подставлять в OpenClipboard, тогда ошибку выдает Thread does not have a clipboard open
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 30-10-2012 08:24 » 

О как. У меня-то параметр NULL. С окном у меня проблемы, в этом месте оно недоступно.
Сегодня выделю специально время на это дело. Короче поиграюсь. Спасибо.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 30-10-2012 14:03 » 

Итак, как и предполагалось вначале, ларчик просто открывался.

Метод использования формата CF_BITMAP работает, но, поскольку, это устройствозависимый формат, ему необходимо окно -> ::OpenClipboard(m_hWnd). А если его нет под рукой и хочется таки использовать CF_DIB?

Код, из первого сообщения, работает замечательно, если прога, поместившая, DIB в буфер обмена "правильно" разместила инфу для "пол-литры" ((с) Лёшик). Тогда смещение +1 в
Код: (C++)
void* pDIBBits = (void*)(lpBI+1);

указывает на нужный блок.

Как показали результаты рентгеноструктурного анализа (микроскопа оказалось недостаточно), так делают далеко не все проги. Поэтому ПРАВИЛЬНО использовать поле структуры LPBITMAPINFO bmiColors. Вот такая поправка, делает код рабочим и для Paint, и для, например, Print Screen:

Код: (C++)
LPBITMAPINFO lpBI = (LPBITMAPINFO)GlobalLock(hGlobal);
Bitmap gdibmp(lpBI, lpBI->bmiColors);

Странно, что нигде на это не натолкнулся, в отличие от смещения +1.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zubr
Гость
« Ответ #9 : 30-10-2012 15:13 » 

Джон, а смещение bmiColors универсально? То есть, к примеру, для фотошопа тоже корректно работает?

P.S. А вообще то да, я туплю, должно корректно работать.
« Последнее редактирование: 30-10-2012 15:18 от zubr » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 30-10-2012 16:10 » new

Вопрос правомерный, и ничего не тупишь. Просто времени нет все исследования подробно расписывать. Коротко.

Фотошоп я проверил в первую очередь. Работает. Почему?

Сама структура BITMAPINFO содержит два поля:

Код: (C++)
typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER    bmiHeader;
    RGBQUAD             bmiColors[1];
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;

Те bmiColors всегда стоят ПОСЛЕ хидера, и, в зависимости от типа данных, корректо заполняются. Поэтому использовать это "смещение" вполне логично. Нууу пока не доказано обратное. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines