Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
7 / 7 / 1
Регистрация: 16.01.2012
Сообщений: 95

Ошибка JPEGImage->Compress()

20.04.2012, 21:38. Показов 2500. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю скиншот экрана
Все вроде ничего, но после 5-10 раза вылетает с ошибкой Out Of system recourses, а иногда держиться довольно долго
вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 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;
    }
Не пойму в чем дело
переделал в
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
    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 камеры)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    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;
    }
в чем моя ошибка, весь день гуглил, крутил так и так, ни что не помогает. Помогите
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.04.2012, 21:38
Ответы с готовыми решениями:

Почему JPEGImage->Compress() работает в TTimer, но не работает в нитке
to: Модератор LK, да я согласен мы маленько отвлеклись :) но просто вопрос наболевший, не дает спать 2 дня уже: Почему в Таймере...

Функция Compress(s,t)
Назначение: замена в строке s множественных вхождений символа t на одно.

функция compress
Люди, плз помогите.:help: Написать и протестировать функцию compress(), которая &quot;сжимает&quot; строку, удаляя из неё все пробелы. надо...

22
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.04.2012, 22:07
ReleaseDC() стопудово нужен, иначе GetDC() жрет ресурсы

Добавлено через 4 минуты
Я всегда так делал
C++
1
2
3
4
5
6
7
8
9
TCanvas *C= new TCanvas;
HDC hdc =GetDC(0);
C->Handle = hdc;
 
Canvas->FillRect(TRect(0,0,Width,Height));
Canvas->CopyRect(Rect(0,0,Width,Height),C,Rect(Left,Top,Left+Width,Top+Height));
 
delete C;
ReleaseDC(0,hdc);
Добавлено через 2 минуты
Но это поидее тоже самое.

А если закоментировать
C++
1
JPEGImage->Compress();
Тоже выскакивает ошибка?
0
7 / 7 / 1
Регистрация: 16.01.2012
Сообщений: 95
20.04.2012, 22:25  [ТС]
да тоже потому что JPEGImage->SaveToStream(MemoryStream);
автоматически вызывает компресс, как сказали

Добавлено через 7 минут
О как
во как оно надо то
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
    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;
        HDC hdc = GetDC(0);
 
        rcDest = Rect(0, 0, 320, 240); 
        rcSource = Screen->DesktopRect;
 
        ScreenCopy->Handle = hdc;
        gr->Height = 240;
        gr->Width = 320;
        gr->Canvas->CopyRect(rcDest,ScreenCopy,rcSource);
 
        JPEGImage->CompressionQuality = 25;
        JPEGImage->Assign(gr);
        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;
 
        ReleaseDC(0, ScreenCopy->Handle);
        ReleaseDC(0,hdc);
        delete ScreenCopy;
        delete gr;
        delete JPEGImage;
        delete MemoryStream;
    }
тока не отображаются контролы (темные места) например в бормане если он открыт, а так пашет.
Можно это как то обойти?

Добавлено через 5 минут
не все равно падает, зараза

Добавлено через 3 минуты
Плавающия ошибка какая то. То есть то нет, хм щас крутится не падает, хотя ни чего не менял. Прикольно.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.04.2012, 22:49
Запихнул код в кнопку (RAD2009)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        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;
}
//---------------------------------------------------------------------------
Никаких ошибок и исключений, память также не растет при многоразовом нажатии кнопки.
Из чего делаю вывод что возможно проблема кроется в строчках
C++
1
2
memset(Buffer,0,sizeof(Buffer));
memcpy(Buffer,Msg.lpData,Msg.cbData);
Либо в объявлении ф-ции как static
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
20.04.2012, 22:58
Цитата Сообщение от DeGroup Посмотреть сообщение
Плавающия ошибка какая то. То есть то нет, хм щас крутится не падает, хотя ни чего не менял. Прикольно.
Скорее ошибка с динамической памятью. Но про бормана мне понравилось Но использование try & catch - катострофически не правильное. Дело в том, что в случае возникновения ошибки, вся память выделенная в try - должна освобождаться, а вот получается, что если ошибки не возникает - то пусть себе выделяется - места то много.

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
Из чего делаю вывод что возможно проблема кроется в строчках
Проблема скорее в том, что выделение памяти (по крайней мере в данном коде) не наблюдается.
0
7 / 7 / 1
Регистрация: 16.01.2012
Сообщений: 95
21.04.2012, 11:48  [ТС]
Продолжим, я тут накидал по быстрому (к коду не придираться я эксперементирую )
Форма содержит таймер три баттона и картинку
Вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//---------------------------------------------------------------------------
#include <vcl.h>
#include <jpeg.hpp>
 
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
    HANDLE hClientThread;
    DWORD dwClientThreadId;
    char b[128000];
    int s;
//---------------------------------------------------------------------------
static void ScreenShot(char *Buffer,int &Size)
{
        TMemoryStream  *MemoryStream;
        TJPEGImage     *JPEGImage;
        TCopyDataStruct Msg;
        int Width = Screen->Width;
        int Height = Screen->Height;
 
        MemoryStream = new TMemoryStream;
        JPEGImage = new TJPEGImage;
 
        TCanvas *ScreenCopy = new TCanvas;
        Graphics::TBitmap *gr = new Graphics::TBitmap();
        TRect rcDest, rcSource;
 
        rcDest = Rect(0, 0, Width, Height);
        rcSource = Screen->DesktopRect;
 
        ScreenCopy->Handle = GetDC(0);
        gr->Height = Height;
        gr->Width = Width;
        gr->Canvas->CopyRect(rcDest,ScreenCopy,rcSource);
        ReleaseDC(0, ScreenCopy->Handle);
 
       JPEGImage->CompressionQuality = 25;
       JPEGImage->Assign(gr);
       JPEGImage->Compress();
       JPEGImage->SaveToStream(MemoryStream);
 
        Msg.dwData = 1;
        Msg.cbData = MemoryStream->Size;
        Msg.lpData = MemoryStream->Memory;
 
        Form1->Image1->Picture->Assign(gr);
 
        memset(Buffer,0,sizeof(Buffer));
        memcpy(Buffer,Msg.lpData,Msg.cbData);
        Size = Msg.cbData;
 
        delete ScreenCopy;
        delete gr;
        delete JPEGImage;
        delete MemoryStream;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
ScreenShot(b,s);
}
//---------------------------------------------------------------------------
static DWORD WINAPI ClientThreadFunction(LPVOID lpParam)
{
    ScreenShot(b,s);
    Sleep(100);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
hClientThread = CreateThread(NULL,0,ClientThreadFunction,0,0,&dwClientThreadId);
CloseHandle(hClientThread);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TTimer *t = new TTimer(NULL);
 
t->Interval = 10;
t->OnTimer = Timer1Timer;
t->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
самый прикол в том, что если пускаешь таймер или его создаешь, то все пучком.
Но если создать нитку, то падает
Проблема то в принципе решена, но просто странно это все
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 11:55
Ну наверное из-за этого
C++
1
Form1->Image1->Picture->Assign(gr);
То есть из-за отстутствия синхронизации с vcl- компонентом.
Используй TThread
0
7 / 7 / 1
Регистрация: 16.01.2012
Сообщений: 95
21.04.2012, 20:05  [ТС]
Согласен. Закомментировал (// Form1->Image1->Picture->Assign(gr); )
не падает, сейчас попытаюсь в собственный класс все это дело впихнуть посмотрю

Добавлено через 8 часов 5 минут
Не все таки не понятно, почему в таймере работает, а в нитке нет.
В чем разница то? Таймер как я понял та же нитка.
ЗЫ: Form1->Image1->Picture->Assign(gr); убрал все равно падает
ЗЫЫ: Я не назойливый, просто хочу разобраться.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 20:48
Да нет Timer как я помню выполняется в том же потоке, попробуйте втавить в обработчик Sleep(10000); и проверьте результат.

C++
1
 Form1->Image1->Picture->Assign(gr); //убрал все равно падает
Это если использовать класс от Thread ( ну и естественно метод Synchronize) ???
0
7 / 7 / 1
Регистрация: 16.01.2012
Сообщений: 95
21.04.2012, 21:03  [ТС]
Вот проект полностью, не знаю в чем траблы
Вложения
Тип файла: rar ScreenShot.rar (55.4 Кб, 12 просмотров)
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 21:13
Что-то я не увидел у вас там TThread ,он должен быть в отдельном модуле
Вот на заметку
При выполнении цикла форма подвисает
Использование TThread для массивов
Создание процесса(Нитки) в отдельном классе
Я там долго распинался, лень делать это заного
0
7 / 7 / 1
Регистрация: 16.01.2012
Сообщений: 95
21.04.2012, 21:34  [ТС]
первый пост это я тупил там static надо было добавить, но это в прошлом
Вопрос вот в чем, я хочу создать нитку не с помощью TThread, а с помощью WINAPI CreateThread
хотя, можно попробовать и с TThread.
только я не понял как создать абстрактный класс TThread помножите?

Добавлено через 1 минуту
перегрузку Execute, Terminate

Добавлено через 7 минут
Просто раньше я нитки добавлял при помощи IDE типа File->New->Other->Thread
и множил их.
А вот как создать без этого не могу понять, вроде класс наследник должен создаться, ан не создается, потому что не перегружен Execute. Если есть пример буду благодарен.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 21:34
Просто с CreateThread я не знаю как использовать синхронизацию с vcl.

А что касается TThread то я описывал как его создавать да и литература есть.
0
7 / 7 / 1
Регистрация: 16.01.2012
Сообщений: 95
21.04.2012, 21:35  [ТС]
Скиньте ссылку плиз или пример
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 21:41
Ну хотя бы это
http://rxlib.ru/WinLesson/bles2_1.htm
0
7 / 7 / 1
Регистрация: 16.01.2012
Сообщений: 95
21.04.2012, 21:48  [ТС]
Ну это при помощи бормана, а вот как без него. Просто я не хочу еще один юнит в программе. Хотел чтобы все было динамически создаваемо и убиваемо.
Хотелось просто
TThread *t = new TThread(false);
но он не создается, т.к. нет метода Execute вот в чем вопрос.
0
21.04.2012, 22:17
 Комментарий модератора 
Кто мне скажет, какое отношение имеет TThread к ошибке JPEGImage->Compress() , т.е., к изначальному вопросу ?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 22:19
А чем второй юнит мешает?
Цитата Сообщение от DeGroup Посмотреть сообщение
росто я не хочу еще один юнит в программе. Хотел чтобы все было динамически создаваемо и убиваемо.
Так он и создается динамически иначе не как!
C++
1
2
3
4
TMyThread *MyThread1 = new TMyThread(true);  // Чем не динамическое создание? TMyThread наследник от TThread
MyThread1->Resume();
//... итд
MyThread1->Terminate(); // Завершение потока!
0
7 / 7 / 1
Регистрация: 16.01.2012
Сообщений: 95
21.04.2012, 22:29  [ТС]
Да вот залезли в дебри, вот пытаемся разобраться

Добавлено через 9 минут
По сути создание TThread или CreateThread разницы нет. Вопрос в том, почему JPEGImage->Compress()
в таймере проходит, а в той или другой нитке нет. Вот главный вопрос.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 22:33
Вот еще тема
Поток: программа зависает во время парсинга
тут я выложил простой пример с двумя потоками одного класса 2хThread.rar
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.04.2012, 22:33
Помогаю со студенческими работами здесь

Функция Compress(s,t)
Назначение: замена в строке s множественных вхождений символа t на одно.

Compress и uncompress палидромов
Нужна помощь с зачётом, в прологе я 0, а дэдлайн уже в пятницу.(В далнейшем не собираюсь использовать этот язык, так как не специализируюсь...

Compress Document Data + Ods 51
Собственно поднимаю тему по сабжу Так как некая ситуация возникает, которую я не совсем понимаю. Имеем сервер 8.5.1 Имеем базу...

Не работает метод Compress для TJpegImage
Всем добрый день. Хочу воспользоваться методом Compress для TJpegImage. Написал тестовую процедуру.var jpg: TJpegImage; bmp:...

Написать программу с функцией Compress, выполняющую сжатие строки
Добрый вечер! Подскажите пожалуйста. Надо написать функцию CompressStr(s), выполняющую сжатие строки s по следующему правилу: каждая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru