Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2012, 21:49   #1
DeGroup
 
Регистрация: 13.09.2011
Сообщений: 8
По умолчанию Ошибка JPEGImage->Compress()

Делаю скиншот экрана
Все вроде ничего, но после 5-10 раза вылетает с ошибкой Out Of system recourses, а иногда держиться довольно долго
вот код
Код:
 static void GetScreenShot(char *Buffer,int &Size)
    {
        TMemoryStream  *MemoryStream;
        TJPEGImage     *JPEGImage;
        TCopyDataStruct Msg;

        MemoryStream = new TMemoryStream;
        JPEGImage = new TJPEGImage;

        Graphics::TBitmap *Bitmap = new Graphics::TBitmap();
        Bitmap->Height=Screen->Height;
        Bitmap->Width=Screen->Width;
        BitBlt(Bitmap->Canvas->Handle,0,0,Screen->Width,Screen->Height,GetDC(0),0,0,SRCCOPY);

        JPEGImage->Assign(Bitmap);
        JPEGImage->CompressionQuality = 25;
        JPEGImage->Compress();                            // <---------- Вот тут вылетает
        JPEGImage->SaveToStream(MemoryStream); 

        Msg.dwData = 1;
        Msg.cbData = MemoryStream->Size;
        Msg.lpData = MemoryStream->Memory;

        memset(Buffer,0,sizeof(Buffer));
        memcpy(Buffer,Msg.lpData,Msg.cbData);

        Size = Msg.cbData;

        delete Bitmap;
        delete JPEGImage;
        delete MemoryStream;
    }
Не пойму в чем дело
переделал в
Код:
    static void GetScreenShot(char *Buffer,int &Size)
    {
        TMemoryStream  *MemoryStream;
        TJPEGImage     *JPEGImage;
        TCopyDataStruct Msg;

        MemoryStream = new TMemoryStream;
        JPEGImage = new TJPEGImage;


        TCanvas *ScreenCopy = new TCanvas;
        Graphics::TBitmap *gr = new Graphics::TBitmap();
        TRect rcDest, rcSource;
 
        rcDest = Rect(0, 0, 320, 240);
        rcSource = Screen->DesktopRect;

        ScreenCopy->Handle = GetDC(0);
       gr->Height = 240;
       gr->Width = 320;
       gr->Canvas->CopyRect(rcDest,ScreenCopy,rcSource);
       ReleaseDC(0, ScreenCopy->Handle);

       JPEGImage->CompressionQuality = 25;
       JPEGImage->Assign(gr);
//        JPEGImage->Compress();
try
{
        JPEGImage->SaveToStream(MemoryStream);
}
catch(Exception &e)
{
}
        Msg.dwData = 1;
        Msg.cbData = MemoryStream->Size;
        Msg.lpData = MemoryStream->Memory;

        memset(Buffer,0,sizeof(Buffer));
        memcpy(Buffer,Msg.lpData,Msg.cbData);

        Size = Msg.cbData;

        delete ScreenCopy;
        delete gr;
        delete JPEGImage;
        delete MemoryStream;
    }
все равно - вылетает. Прочитал что при JPEGImage->SaveToStream(MemoryStream) метод JPEGImage->Compress() вызывается автоматически.
Но не понятно, почему данный код (см. ниже) работает стабильно (использую DSPack для отлова кадров с WEB камеры)
Код:
    static void GetVideoFromVideoDevice(char *Buffer,int &Size)
    {
        TMemoryStream  *MemoryStream = new TMemoryStream;;
        TJPEGImage     *JPEGImage = new TJPEGImage;
        TCopyDataStruct Msg;

        MainForm->SampleGrabber->GetBitmap(MainForm->VideoImage->Picture->Bitmap);
        Application->ProcessMessages();
        MemoryStream->Position = 0;
        MemoryStream->Clear();

        JPEGImage->Assign(MainForm->VideoImage->Picture->Bitmap);
        JPEGImage->CompressionQuality = 25;
        JPEGImage->Compress();
        JPEGImage->SaveToStream(MemoryStream);

        Msg.dwData = 1;
        Msg.cbData = MemoryStream->Size;
        Msg.lpData = MemoryStream->Memory;

        memset(Buffer,0,sizeof(Buffer));
        memcpy(Buffer,Msg.lpData,Msg.cbData);

        Size = Msg.cbData;
        delete MemoryStream;
        delete JPEGImage;
    }
в чем моя ошибка, весь день гуглил, крутил так и так, ни что не помогает. Помогите
DeGroup вне форума Ответить с цитированием
Старый 23.04.2012, 16:30   #2
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

срочно переделать!
Код:
memset(Buffer,0,sizeof(Buffer)); //заполнит нулем только первый байт
а это может не влезть в твой буфер
Код:
memcpy(Buffer,Msg.lpData,Msg.cbData);
Насколько я помню в мемористрим есть метод заполнения внешнего буфера из потока.
типа
Код:
MemoryStream->WriteBuffer(Buffer, MemoryStream->Size );
Знающий не говорит, говорящий не знает (С) Лао Цзы

Последний раз редактировалось Krok27; 23.04.2012 в 16:46.
Krok27 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Nero - ошибка драйвера DMA. ошибка CRC NecRoMat Софт 5 09.05.2012 01:29
Где ошибка в этом исходном коде на языке Си? Или ошибка в Excel? ArchiCurtis Помощь студентам 2 07.04.2012 14:16
Compress Picture a_zheshko Microsoft Office Word 4 11.04.2011 11:48
Ошибка run-time Error 1004 общая ошибка ODBC kaval88 Microsoft Office Excel 0 27.02.2011 20:20
Ошибка в коде, ошибка в css или это проблема с совместимостью с браузерами? ankris HTML и CSS 5 23.11.2010 16:58