Nano Hash - криптовалюты, майнинг, программирование

Как скопировать картинку с диска в буфер обмена с помощью win32?

С помощью win32 API скопировать текст в буфер обмена несложно, но я хочу скопировать картинку с диска (например, D:\1.jpg) в буфер обмена.

Я ищу много веб-страниц, и я не могу найти что-то полезное. Пожалуйста, научите меня, как это сделать.

И никакого МФЦ.

29.08.2016

Ответы:


1

Вы можете использовать Gdi+ чтобы загрузить изображение, получите HBITMAP и установите данные буфера обмена. Gdi+ поддерживает только Unicode, поэтому при использовании старых функций ANSI необходимо преобразовать имя файла в широкий символ. Пример на С++:

bool copyimage(const wchar_t* filename)
{
    bool result = false;
    Gdiplus::Bitmap *gdibmp = Gdiplus::Bitmap::FromFile(filename);
    if (gdibmp)
    {
        HBITMAP hbitmap;
        gdibmp->GetHBITMAP(0, &hbitmap);
        if (OpenClipboard(NULL))
        {
            EmptyClipboard();
            DIBSECTION ds;
            if (GetObject(hbitmap, sizeof(DIBSECTION), &ds))
            {
                HDC hdc = GetDC(HWND_DESKTOP);
                //create compatible bitmap (get DDB from DIB)
                HBITMAP hbitmap_ddb = CreateDIBitmap(hdc, &ds.dsBmih, CBM_INIT,
                    ds.dsBm.bmBits, (BITMAPINFO*)&ds.dsBmih, DIB_RGB_COLORS);
                ReleaseDC(HWND_DESKTOP, hdc);
                SetClipboardData(CF_BITMAP, hbitmap_ddb);
                DeleteObject(hbitmap_ddb);
                result = true;
            }
            CloseClipboard();
        }

        //cleanup:
        DeleteObject(hbitmap);  
        delete gdibmp;              
    }
    return result;
}

Обратите внимание, что Microsoft рекомендует использовать CF_DIB для установки данных растрового буфера обмена, но это не работает с GDI+. В этом примере вместо этого используется CF_BITMAP.

Gdi+ использует стандартную библиотеку GdiPlus.lib. Его нужно инициализировать следующим образом:

#include <Windows.h>
#include <GdiPlus.h>

#pragma comment(lib, "GdiPlus")//Visual Studio specific

bool copyimage(const wchar_t* filename);

int main()
{
    //initialize Gdiplus once:
    Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    copyimage(L"d:\\1.jpg");

    Gdiplus::GdiplusShutdown(gdiplusToken);
}
29.08.2016
  • @JonathanPotter Я предположил, что если Gdi+ успешно загрузит изображение, то GetHBITMAP, GetObject и SetClipboardData будут в порядке. Или это плохое предположение? GetObject выглядит критично, для этого я добавил проверку на ошибки. 29.08.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..