На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Коротко о разделе:
Здесь разрешается создавать темы, относящиеся к любому языку программирования, для которого не существует раздела на форуме (например, Lisp, Tcl/Tk, FORTRAN и т.д.). Если раздел для нужного Вам языка есть, большая просьба создавать тему в нем.
Вопросы, связанные с JScript, Perl, PHP обсуждаются в разделе WWW Masters.

Обратите внимание:
1. Прежде чем задать вопрос, воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали.
2. Если Ваш вопрос связан с конкретным языком программирования, обязательно укажите название языка в имени темы.
3. Постарайтесь давать темам информативные названия. Темы с названиями типа "Помогите, горю" будут удалены.
4. Помните, чем грамотней будет задан Ваш вопрос, тем больше будет у Вас шансов получить на него ответ. Как правильно задавать вопросы
5. Ипользуйте тег [ code ] ...текст программы... [ /code ] для выделения текста программы.

Просьбы выполнить какую-либо работу за автора в этом разделе не обсуждаются. Темы с подобными просьбами будут перемещены или удалены. Для заказов у нас существуют специальные разделы: Разовые заказы и подработка, ПОМОЩЬ СТУДЕНТАМ.

Если кто не понял (а такие есть) — чтобы за вас решали ваши задачки, идите на другие ресурсы.

Полезные ссылки:
Есть. ;)
Наши Исходники | GPSS (en), GPSS (ru) (!) | Common Lisp | Tcl/Tk | Haskell | Lua
Модераторы: B.V.
  
> GDI+ не сохраняется картинка в файл , GdipSaveImageToFile возвращает ObjectBusy
    По ряду причин необходимо сделать простенькое приложение в AutoPlay Media Studio - конвертер изображений. Согласно представленному здесь примеру набросал код:

    ExpandedWrap disabled
      gdiplusToken = 0;
       
      -- exit application
      function AppExit()
          -- free image
          if (image and MemoryEx.DWORD(image) ~= 0) then
              GDIE_STATE = GDI.GdipDisposeImage(image);
              if (GDIE_STATE ~= GDI_OK) then Dialog.Message("GDI error", "GdipDisposeImage: " .. GDI_ERROR[GDIE_STATE]); end
          end
          -- shutdown GDI+
          if (gdiplusToken ~= 0) then
              GDIE_STATE = GDI.GdiplusShutdown(gdiplusToken);
              if (GDIE_STATE ~= GDI_OK) then Dialog.Message("GDI error", "GdiplusShutdown: " .. GDI_ERROR[GDIE_STATE]); end
          end
          -- free some memory
          if (zero)                 then MemoryEx.Free(zero);                 end
          if (pfilePNG)             then MemoryEx.Free(pfilePNG);             end
          if (pCLSID)               then MemoryEx.Free(pCLSID);               end
          if (pstrCLSID)            then MemoryEx.Free(pstrCLSID);            end
          if (image)                then MemoryEx.Free(image);                end
          if (pfileBMP)             then MemoryEx.Free(pfileBMP);             end
          if (pgdiplusStartupInput) then MemoryEx.Free(pgdiplusStartupInput); end
          if (pgdiplusToken)        then MemoryEx.Free(pgdiplusToken);        end
          Window.Close(Application.GetWndHandle(), CLOSEWND_TERMINATE);
      end
       
      -- loading libraries
      OLE = Library.Load("OLE32.dll");
      GDI = Library.Load("GDIPLUS.dll");
       
      -- GDI+ error codes
      GDI_OK    = 0;
      GDI_STATE = 0;
      GDI_ERROR = {"GenericError", "InvalidParameter", "OutOfMemory", "ObjectBusy", "InsufficientBuffer", "NotImplemented", "Win32Error", "WrongState", "Aborted", "FileNotFound", "ValueOverflow", "AccessDenied", "UnknownImageFormat", "FontFamilyNotFound", "FontStyleNotFound", "NotTrueTypeFont", "UnsupportedGdiplusVersion", "GdiplusNotInitialized", "PropertyNotFound", "PropertyNotSupported", "ProfileNotFound"};
       
      -- define file paths
      local fileBMP = _SourceFolder .. "\\AutoPlay\\Images\\i.bmp"
      local filePNG = _SourceFolder .. "\\AutoPlay\\Images\\o.png";
       
      -- pointer to GDI+ Token
      pgdiplusToken = MemoryEx.Allocate(4);
      -- define structure gdiplusStartupInput
      local gdiplusStartupInput = MemoryEx.DefineStruct{UDWORD ("GdiplusVersion"); UDWORD ("DebugEventCallback"); BYTE ("SuppressBackgroundThread"); BYTE ("SuppressExternalCodecs");};
      -- create structure gdiplusStartupInput
      local hgdiplusStartupInput = gdiplusStartupInput:New();
      -- fill structure gdiplusStartupInput
      hgdiplusStartupInput.GdiplusVersion           = 1;
      hgdiplusStartupInput.DebugEventCallback       = 0;
      hgdiplusStartupInput.SuppressBackgroundThread = false;
      hgdiplusStartupInput.SuppressExternalCodecs   = false;
      -- pointer to structure gdiplusStartupInput
      pgdiplusStartupInput = hgdiplusStartupInput:GetPointer();
       
      -- init GDI+
      GDIE_STATE = GDI.GdiplusStartup(pgdiplusToken, pgdiplusStartupInput, 0);
      if (GDIE_STATE ~= GDI_OK) then Dialog.Message("GDI error", "GdiplusStartup: " .. GDI_ERROR[GDIE_STATE]); Window.Close(Application.GetWndHandle(), CLOSEWND_TERMINATE); end
      gdiplusToken = MemoryEx.DWORD(pgdiplusToken);
      if (gdiplusToken == 0) then Dialog.Message("GDI error", "gdiplusToken: 0"); Window.Close(Application.GetWndHandle(), CLOSEWND_TERMINATE); end
       
      -- path to source image file (Unicode, NULL terminated)
      pfileBMP = MemoryEx.Allocate(String.Length(fileBMP) * 2 + 1);
      MemoryEx.String(pfileBMP, -1, MEMEX_UNICODE, fileBMP);
      image = MemoryEx.Allocate(4);
      -- loading source image
      GDIE_STATE = GDI.GdipLoadImageFromFile(pfileBMP, image);
      if (GDIE_STATE ~= GDI_OK) then Dialog.Message("GDI error", "GdipLoadImageFromFile: " .. GDI_ERROR[GDIE_STATE]); AppExit(); end
       
      -- get PNG encoder ID
      local strCLSID  = "{557CF406-1A04-11D3-9A73-0000F81EF32E}";
      pstrCLSID = MemoryEx.Allocate(String.Length(strCLSID) * 2 + 1);
      MemoryEx.String(pstrCLSID, -1, MEMEX_UNICODE, strCLSID);
      pCLSID = MemoryEx.Allocate(16);
      GDIE_STATE = OLE.CLSIDFromString(pstrCLSID, pCLSID);
      if (GDIE_STATE ~= GDI_OK) then Dialog.Message("OLE32 error", "CLSIDFromString: " .. GDIE_STATE); AppExit(); end
      -- pCLSID is a pointer to 16-bytes binary encoder ID, must be 0x06F47C55041AD3119A730000F81EF32E (checked)
       
      -- path to output image file (Unicode, NULL terminated)
      pfilePNG = MemoryEx.Allocate(String.Length(filePNG) * 2 + 1);
      MemoryEx.String(pfilePNG, -1, MEMEX_UNICODE, filePNG);
      zero = MemoryEx.Allocate(4); -- pointer to constant [DWORD] = 0, info here http://www.vbforums.com/showthread.php?663593.html
      -- save image as PNG-file
      GDIE_STATE = GDI.GdipSaveImageToFile(image, pfilePNG, pCLSID, zero);
      if (GDIE_STATE ~= GDI_OK) then Dialog.Message("GDI error", "GdipSaveImageToFile: " .. GDI_ERROR[GDIE_STATE]); AppExit(); end
      Dialog.Message("GDI", "PNG file saved!");


    Но функции GdipSaveImageToFile и в дальнейшем GdipDisposeImage возвращают код ошибки ObjectBusy. Подскажите, пожалуйста, что может быть не так?
    Сообщение отредактировано: vazzzzz -
      M
      Представленный код - не на языках C/C++ (вероятно, Lua?).
      Поэтому переезжаем?
      Сообщение отредактировано: JoeUser -
        JoeUser вопрос всё таки по работе Win API (GDI+)...? Сам код на основе Lua конечно.
          Разобрался вроде с загрузкой и сохранением. Если кто знает как средствами GDI+ задать определенному цвету значение альфы? (чтобы сделать его полупрозрачным)
            ExpandedWrap disabled
                Gdiplus::Pen pen(Gdiplus::Color(96, 0, 0, 255));   // alpha, red, green, blue
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0309 ]   [ 16 queries used ]   [ Generated: 28.03.24, 18:01 GMT ]