На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> Ввод растрового изображения для дальнейшей работы в GDI+…
    Есть всякие экзотические форматы графики, которые распаковываются в простой битмап RGB888 или RGBA8888. Заголовков нет, только известны размеры ширины и высоты.

    Выводил это через CreateCompatibleBitmap - SetDIBits - StretchBlt… Успешно, но хочу освоить GDI+.

    Изучил тему про [C++] Работа с растровыми изображениями, Эффекты, трансформация, приделал GDI+…
    Но есть вопросы:


    1. как бы в это GDI+ вставить простой растр?

    Имеется например RGB-дамп (заполнение сверху вниз) в такой вот памяти:
    HLOCAL hMemoryRAW = LocalAlloc(LPTR, sizeMemoryRAW);
    и его размеры
    UINT RAW_height = 480;
    UINT RAW_widht = 640;
    Примерно так он выводился на экране:
    hBitmap = CreateCompatibleBitmap(hDC, RAW_width, RAW_height);
    SetDIBits(hDC, hBitmap, 0, RAW_height, hMemoryRAW, (BITMAPINFO*)&bih, DIB_RGB_COLORS);
    SelectObject(hCompatibleDC, hBitmap);
    StretchBlt(hDC, 0, 0, Rect.right, Rect.bottom, hCompatibleDC, 0, 0, RAW_width, RAW_height, SRCCOPY);

    В случае GDI+ - очевидно вместо этого:
    pImage = new Image(lpFileName);
    надо что-то другое…
    Как в это pImage создать картинку не из файла, а из простого растра в вышеупомянутом (HLOCAL)hMemoryRAW и размеров RAW_height/RAW_widht ?


    2. А как в pImage = new Image() читать файл не из диска, а тоже из (HLOCAL)-памяти?
    В MSDN упоминается что оно умеет читать не только файлы но и потоки… Однако внятного примере как этот поток приделать - я не нашёл…
      Цитата f2065 @
      Как в это pImage создать картинку не из файла, а из простого растра в вышеупомянутом (HLOCAL)hMemoryRAW и размеров RAW_height/RAW_widht ?

      Например, так.

      Цитата f2065 @
      2. А как в pImage = new Image() читать файл не из диска, а тоже из (HLOCAL)-памяти?

      Ответ аналогичен ответу выше. Для удобства, можно использовать IStream и ::FromStream соответственно.
      const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
      for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;


      user posted image Чат Исходников в СкайпеНе тормози, форум теперь здесь!Чат Исходников в Дискорде
        Кстати в примере работы GDI+ - у меня почему-то в Win 8.1 не работает сохранение в PNG.
        Даже в оригинальном GraphicsDemo.exe при сохранении примера Ladybug.png получается нулевой файл.
        Проверил в чистой виртуалке с Win10 - тоже файлы не сохраняются. BMP (через GDI+) сохраняется нормально…

        В примере ошибка в инициализации компрессора для PNG…
        Посмотрел pImage->GetLastStatus() - ошибка 2 (InvalidParameter)…
        Убрал для PNG pEncParams:
        pImage->Save(text_filename, &EncClsid, 0);
        и сохранение заработало.
        Очевидно pEncParams->Count = 0; не равнозначно отсутствия структуры параметров (которая не нужна для PNG).

        Или решать эту проблему с PNG надо как-то по другому?
          Цитата f2065 @
          Очевидно pEncParams->Count = 0; не равнозначно отсутствия структуры параметров

          Да, нужно указывать Null, а раньше на XP этот параметр, когда был не нужен, просто игнорировался.
            Ещё вопрос возник. Предположим, есть pImage = new Image("file.png");

            На каком-то этапе мне надо её в виде битмапа попиксельно считать.
            Примеров полно, но они все начинаются с того что pBitmap = new Bitmap("file.bmp");

            Пишут что из Image наследуется и Bitmap, но что-то у меня никак не получается его найти там.
            Попробовал так:

            ExpandedWrap disabled
              Image *pImage = new Image("file.png");
               
              Rect rect;
              rect.X = 0;
              rect.Y = 0;
              rect.Width = pImage->GetWidth();
              rect.Height = pImage->GetHeight();
               
              Graphics *pGraphics = new Graphics(pImage);
              Bitmap *pBitmap = new Bitmap(rect.Width, rect.Height, pGraphics);
              Gdiplus::BitmapData *bitmapData = new Gdiplus::BitmapData;
              pBitmap->LockBits(&rect, Gdiplus::ImageLockModeRead, PixelFormat32bppARGB, bitmapData);

            Ожидаемого эффекта не даёт почему-то. Т.е. оно создаёт чистую картинку (X/Y правильные, bitmapData->Height тоже) - в bitmapData->Scan0 одни нули, а не то что лежит в pImage…
            Каким образом из моего pImage сделать pBitmap ?
            Сообщение отредактировано: f2065 -
              Цитата f2065 @
              Каким образом из моего pImage сделать pBitmap ?

              А почему бы сразу не делать битмап:
              ExpandedWrap disabled
                Bitmap Bmp = (Bitmap)Bitmap.FromFile(FileName);

              Это шарп, плюсов под рукой нет.
              Сообщение отредактировано: Mikle -
                Цитата Mikle @
                А почему бы сразу не делать битмап:

                Потому что это не единственный источник изображения, их много разных, некоторые сразу в Image.
                Да, если сразу сделать Bitmap из файла - то с ним проблем нет, он нормально попиксельно читается после LockBits.
                Но мне всё-же надо выковырять Bitmap из Image…
                Должен же быть какой-то способ (особенно если там заведомо растровый файл)?
                  ExpandedWrap disabled
                    *pBitmap = (Bitmap)*pImage;

                  Как-то так тоже не работает?
                    Цитата Mikle @
                    Как-то так тоже не работает?
                    Угу, «Не существует подходящего определяемого пользователем преобразования из "Gdiplus::Image" в "Gdiplus::Bitmap"»

                    Кроме как сохранять Image во временный файл и потом его читать в Bitmap - ничего не могу придумать. Но это как-то слишком некрасиво получается, должен же быть какой-то путь преобразования из Image в Bitmap напрямую в памяти.
                    Сообщение отредактировано: f2065 -
                      Цитата f2065 @
                      Каким образом из моего pImage сделать pBitmap ?

                      Save в IStream и FromStream?
                      const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
                      for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;


                      user posted image Чат Исходников в СкайпеНе тормози, форум теперь здесь!Чат Исходников в Дискорде
                      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script Execution time: 0,1027 ]   [ 17 queries used ]   [ Generated: 11.12.19, 00:10 GMT ]