GDI+

Тема в разделе "WASM.BEGINNERS", создана пользователем l_inc, 17 июл 2007.

  1. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Добрый день.
    Создаю с помощью CreateStreamOnHGlobal объект класса IStream (надеюсь, что правильно выразился), указав StreamBuffer в качестве буфера этого объекта. При этом StreamBuffer я сам выделял (не хочу давать CreateStreamOnHGlobal выделять мой буфер) размером в один мегабайт. После этого конвертирую с помощью GdipSaveImageToStream из своей bmp-картинки в jpg-картинку. При этом весь JPEG попадает в мой буфер StreamBuffer. Как мне определить, какой размер буфера надо выделять (ну ладно, заранее наверняка, что никак, но как узнать, какую часть буфера заполнил, а может переполнил GdipSaveImageToStream?) ?
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    IStream:Stat вроде
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    FreeManCPM
    И да и нет... вроде.
    Я так понял, что Вы имеете в виду поле cbSize структуры STATSTG. Но проблема в том, что это поле после GdipSaveImageToStream содержит размер выделенного мной буфера (т.е. ровно один мегабайт), а не количество байт, записанных в этот буфер функцией GdipSaveImageToStream.
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    FreeManCPM
    Попробовал задать буфер, размером в десять байт, тогда cbSize возвращает нужный размер, но каким образом мой буфер тогда не переполняется? GdipSaveImageToStream каким-то образом довыделяет память?
    P.S. Хотя я ожидал, что GdipSaveImageToStream вернет StatusInsufficientBuffer.
     
  5. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    я вобще ноль кидал в первый параметр CreateStreamOnHGlobal...
    можешь попробовать сделать IStream:Seek(0,STREAM_SEEK_CUR,&newsize) после заполнения и возможно получишь то что надо.
     
  6. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    В MSDN про 1й параметр функции CreateStreamOnHGlobal сказано:

    hGlobal
    [in] The memory handle allocated by the GlobalAlloc function. The handle must be allocated as movable and nondiscardable. If the handle is shared between processes, it must also be allocated as shared. New handles should be allocated with a size of zero. If hGlobal is NULL, the CreateStreamOnHGlobal function internally allocates a new shared memory block of size zero.

    Так что можно смело задавать 0 в GlobalAlloc или вообще оставить выделение памяти на совести CreateStreamOnHGlobal.

    Сейчас попробовал оба варианта - через Stat и через Seek. Оба возвращают корректный размер записанного jpeg'а.
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    FreeManCPM
    Может воспользуюсь, но думаю, что буду выделять вначале буфер, размером в 1 байт, а потом пусть мне GdipSaveImageToStream расширяет мой буфер. Т.е. проблема решена. Теперь мне просто интересно, почему GdipSaveImageToStream не возвращает StatusInsufficientBuffer, а довыделяет память. Хотя ну его: наверное StatusInsufficientBuffer для чего-то другого рассчитан.
    Большой сэнкс.
    roman_pro
    Спасибо. Я знаю, что в MSDN сказано. Именно поэтому я во избежание подобных ответов в первом посте написал