Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 17.01.2017
Сообщений: 46

Возможно ли считать 2000 пикселей с экрана, очень быстро?

19.11.2017, 02:04. Показов 1518. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возникла задача, сделать программу для перевода текста из картинки, но столкнулся с проблемой, что пиксели считываются очень медленно, с getpixel это вообще занимает очень много времени, я даже не ждал, а вот был еще какой-то способ я его скопировал, что то с bitmap связано, но он тоже работает очень долго, но уже быстрее. Если способ как-то считать пиксели с экрана за 1 секунду? Или это вообще невозможно.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.11.2017, 02:04
Ответы с готовыми решениями:

Как максимально быстро считать очень большой текст из файла
как максимально быстро считать ооочень большой текст из файла и поеместить в richTextBox1?

Внезапно меняется яркость экрана, много раз подряд, очень быстро
Доброго времени суток. Ну, мою проблему вы прочитали в заголовке. Скажу ещё что ноут в принципе старый ~6-7 лет. Повторю ещё раз...

Быстро получить цвета всех пикселей на экране
Быстро получить цвета всех пикселей на экране и записать их в массив. Getpixel не подходит по причине медленной скорости работы. ...

10
Фриланс Pascal/Delphi etc
 Аватар для ILinker
67 / 73 / 16
Регистрация: 25.11.2016
Сообщений: 263
19.11.2017, 08:40
APCEH, GetDIBits() и считывать пиксели через указатель.

Добавлено через 1 минуту
APCEH, GetPixel(), BitMap()
0
Evg
19.11.2017, 14:11

Не по теме:

Цитата Сообщение от decrement Посмотреть сообщение
а то лень с нуля писать)
А он и не просил с нуля писать. Вопрос поставлен так, что ему вроде бы как достаточно сказать, каким интерфейсом пользоваться

0
19.11.2017, 14:20

Не по теме:


Цитата Сообщение от Evg Посмотреть сообщение
А он и не просил с нуля писать. Вопрос поставлен так, что ему вроде бы как достаточно сказать, каким интерфейсом пользоваться
мне просто кажется что у него с кодом что то не так) я писал подобную программу с этими же функциями и у меня работало достаточно быстро.
И в контексте вопроса замечается, что человек плохо разбирается в этом деле
Цитата Сообщение от APCEH Посмотреть сообщение
а вот был еще какой-то способ я его скопировал, что то с bitmap связано

0
0 / 0 / 0
Регистрация: 17.01.2017
Сообщений: 46
19.11.2017, 19:52  [ТС]
Нет я вас уверяю с гетпикселем, всегда лагает, кроме как for в программе ничего нету, с битмап сейчас уже не найду,
0
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
19.11.2017, 20:02
Цитата Сообщение от APCEH Посмотреть сообщение
Нет я вас уверяю с гетпикселем, всегда лагает
забудьте о getpixel) это кривая функция)
я когда-то делал что то подобное) попробую найти)
P.S: полно файлов и проектов) не помню в каком оно есть
0
0 / 0 / 0
Регистрация: 17.01.2017
Сообщений: 46
19.11.2017, 20:04  [ТС]
GetDIBits() да вот с этим я делал, да это намного быстрее чем getpixel(), но все равно долго.
0
Фриланс Pascal/Delphi etc
 Аватар для ILinker
67 / 73 / 16
Регистрация: 25.11.2016
Сообщений: 263
19.11.2017, 21:04
APCEH, код в студию.
0
0 / 0 / 0
Регистрация: 17.01.2017
Сообщений: 46
19.11.2017, 23:51  [ТС]
Завтра скину ибо я уже его потерял.

Добавлено через 5 минут
C++ (Qt)
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <math.h>
#include <stdio.h>
using namespace std;
int sX, sY, x, y;
 
BYTE* sData = 0;
 
POINT cursorPos;
 
HDC hScreen;
HDC hdcMem;
HBITMAP hBitmap;
HGDIOBJ hOld;
 
 
void PixelFunction();   // Get the pixel rgb function
 
int main()
{
    PixelFunction();
 
    ReleaseDC(NULL, hScreen);
    DeleteDC(hdcMem);
 
    return 0;
}
 
void PixelFunction()
{
    int Red, Green, Blue;
    int A[300][30] = { 0 };
    hScreen = GetDC(NULL);
 
    sX = GetDeviceCaps(hScreen, HORZRES);
    sY = GetDeviceCaps(hScreen, VERTRES);
 
    hdcMem = CreateCompatibleDC(hScreen);
    hBitmap = CreateCompatibleBitmap(hScreen, sX, sY);
 
    BITMAPINFOHEADER bm = { 0 };
    bm.biSize = sizeof(BITMAPINFOHEADER);
    bm.biPlanes = 1;
    bm.biBitCount = 32;
    bm.biWidth = sX;
    bm.biHeight = -sY;
    bm.biCompression = BI_RGB;
    bm.biSizeImage = 0; // 3 * sX * sY;
    FILE * pFile;
    fopen_s(&pFile, "C:/Users/apceh/Documents/Output.txt", "w");
    while (1) {
 
        hOld = SelectObject(hdcMem, hBitmap);
        BitBlt(hdcMem, 0, 0, sX, sY, hScreen, 0, 0, SRCCOPY);
        SelectObject(hdcMem, hOld);
 
        free(sData);
        sData = (BYTE*)malloc(4 * sX * sY);
 
        GetDIBits(hdcMem, hBitmap, 0, sY, sData, (BITMAPINFO*)&bm, DIB_RGB_COLORS);
 
        GetCursorPos(&cursorPos);
        for (int i = 0; i < 300; i++)
        {
        x = cursorPos.x + i;
        for (int j = 0; j < 30; j++)
        {
        y = cursorPos.y + j;
        Red = sData[4 * ((y * sX) + x) + 2];
        Green = sData[4 * ((y * sX) + x) + 1];
        Blue = sData[4 * ((y * sX) + x)];
        if (Red == 255 && Blue == 255 && Green == 255)
        {
        A[i][j] = 1;
        }
        }
        }
        if (GetAsyncKeyState(VK_F5))
        {
            int last = cursorPos.x;
            int lasty = cursorPos.y;
            for (int i = last; i <last + 200; i++)
            {
                for (int j = lasty; j < lasty + 20; j++)
                {
                    SetCursorPos(i, j);
                    x = cursorPos.x;
                    y = cursorPos.y;
                    Red = sData[4 * ((y * sX) + x) + 2];
                    Green = sData[4 * ((y * sX) + x) + 1];
                    Blue = sData[4 * ((y * sX) + x)];
                    if (Red == 255 && Blue == 255 && Green == 255)
                    {
                        A[i - last][j - lasty] = 1;
                    }
                }
 
            }
 
            break;
        }
 
    }
    for (int i = 0; i < 300; i++)
    {
        for (int j = 0; j < 30; j++)
        {
 
            fprintf(pFile, "%d", A[i][j]);
        }
        fprintf(pFile, "\n");
    }
    fclose(pFile);
    int z = 0;
    int count = 0;
    int B[300] = { 0 };
    int lastcount = 0;
    for (int i = 0; i < 300; i++)
    {
        lastcount = 0;
        for (int j = 0; j < 30; j++)
        {
            if (A[i][j] == 1)
            {
                count++;
                lastcount++;
            }
        }
        if (lastcount == 0)
        {
            B[z] = count;
            count = 0;
            z++;
        }
    }
    for (int i = 0; i < 300; i++)
    {
        if (B[i] != 0)printf("%d ", B[i]);
    }
    printf("%d ", count);
    scanf_s("%d", NULL);
}
Добавлено через 1 минуту
Конечно там много еще бреда написано, но я думаю разобраться не сложно.

Добавлено через 9 минут
То что там с count связано это не читайте это позже будет использоваться для обработки текста, где шрифт всегда будет одинаковый, и по количеству белых пикселей в символе будет определятся что это за символ.
0
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
21.11.2017, 13:31
Цитата Сообщение от decrement Посмотреть сообщение
я когда-то делал что то подобное) попробую найти)
P.S: полно файлов и проектов) не помню в каком оно есть
Нашел)
Цитата Сообщение от APCEH Посмотреть сообщение
GetDIBits() да вот с этим я делал, да это намного быстрее чем getpixel(), но все равно долго.
У меня как раз с использованием GetDIBits. Не знаю почему у вас долго, но в моем коде все пиксели определяется мгновенно. На копирование идёт 3 секунды (но потому что используется функция SetPixel, без неё все мгновенно)
Вот
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <windows.h>
 
#define MyGetPixel(bytes,x,y,width,height,colorbits) \
    ((COLORREF)((BYTE)(bytes [(colorbits) * (((height)-(y)) * (width) + (x)) + 2]) | \
               ((BYTE)(bytes [(colorbits) * (((height)-(y)) * (width) + (x)) + 1]) << 8) | \
               ((BYTE)(bytes [(colorbits) * (((height)-(y)) * (width) + (x))]) << 16)))
 
static SIZE screen_size;
static HDC hImageDC;
static HBITMAP hImageBitmap, hImageOldBitmap;
 
DWORD WINAPI Thread (LPVOID hWnd)
{
    HDC hDisplayDC = CreateDC ("DISPLAY", NULL, NULL, NULL);
    if (hDisplayDC)
    {
         screen_size.cx = GetDeviceCaps (hDisplayDC, HORZRES);
         screen_size.cy = GetDeviceCaps (hDisplayDC, VERTRES);
         
         if (hImageDC)
         {
              SelectObject (hImageDC, hImageOldBitmap);
              DeleteObject (hImageBitmap);
              DeleteDC (hImageDC);
         }
         
         HDC hDC = GetDC ((HWND) hWnd);
         hImageDC = CreateCompatibleDC (hDC);
         hImageBitmap = CreateCompatibleBitmap (hDC, screen_size.cx, screen_size.cy);
         hImageOldBitmap = (HBITMAP) SelectObject (hImageDC, hImageBitmap);
         PatBlt (hImageDC, 0, 0, screen_size.cx, screen_size.cy, WHITENESS);
         
         HDC hMemDC = CreateCompatibleDC (hDC);
         HBITMAP hMemBmp = CreateCompatibleBitmap (hDC, screen_size.cx, screen_size.cy);
         HBITMAP hOldBmp = (HBITMAP) SelectObject (hMemDC, hMemBmp);
         BitBlt (hMemDC, 0, 0, screen_size.cx, screen_size.cy, hDisplayDC, 0, 0, SRCCOPY);
         ReleaseDC ((HWND) hWnd, hDC);
         
         BITMAPINFO bi = {0};
         bi.bmiHeader.biSize = sizeof (bi.bmiHeader);
         GetDIBits (hMemDC, hMemBmp, 0, 0, NULL, &bi, DIB_RGB_COLORS);
         bi.bmiHeader.biCompression = BI_RGB;
         WORD ColorBits = bi.bmiHeader.biBitCount >> 3;
         BYTE *bytes = (BYTE *) GlobalAlloc (GPTR, bi.bmiHeader.biSizeImage * ColorBits);
         GetDIBits (hMemDC, hMemBmp, 0, bi.bmiHeader.biHeight, (LPVOID) bytes, &bi, DIB_RGB_COLORS);
         
         for (int x=0; x<screen_size.cx; x++)
              for (int y=0; y<screen_size.cy; y++)
              {
                   COLORREF pixel = MyGetPixel (bytes, x, y, bi.bmiHeader.biWidth, bi.bmiHeader.biHeight, ColorBits);
                   SetPixel (hImageDC, x, y, pixel);
              }
         SelectObject (hMemDC, hOldBmp);
         DeleteObject (hMemBmp);
         DeleteDC (hMemDC);
         GlobalFree ((HGLOBAL) bytes);
         DeleteDC (hDisplayDC);
         InvalidateRect ((HWND) hWnd, NULL, TRUE);
    }
    return 0;
}
 
LRESULT CALLBACK WindowProcedure (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
         case WM_CREATE:
         {
              CreateWindow ("button", "grab pixels", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 10, 10, 100, 20, hWnd, (HMENU) 1, NULL, NULL);
         }
         break;
         
         case WM_COMMAND:
         {
              if (LOWORD (wParam) == 1)
              {
                   DWORD thID;
                   CreateThread (NULL, 0, Thread, (LPVOID) hWnd, 0, &thID);
              }
         }
         break;
         
         case WM_PAINT:
         {
              PAINTSTRUCT ps;
              HDC hDC = BeginPaint (hWnd, &ps);
              if (hImageDC)
                   BitBlt (hDC, 10, 50, screen_size.cx, screen_size.cy, hImageDC, 0, 0, SRCCOPY);
              EndPaint (hWnd, &ps);
         }
         break;
         
         case WM_DESTROY:
         {
              if (hImageDC)
              {
                   SelectObject (hImageDC, hImageOldBitmap);
                   DeleteObject (hImageBitmap);
                   DeleteDC (hImageDC);
              }
              PostQuitMessage (0);
         }
         break;
    }
    return DefWindowProc (hWnd, msg, wParam, lParam);
}
 
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
    WNDCLASS wc;
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = WindowProcedure;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
    wc.lpszClassName = "grab_pixel_class";
    wc.lpszMenuName  = NULL;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    
    if (!RegisterClass (&wc))
    {
         MessageBox (NULL, "Window Registration Failed!", "Error!", MB_OK | MB_ICONERROR);
         return 0;
    }
    
    HWND hWnd = CreateWindow (wc.lpszClassName, "___", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, 700, 500, NULL, NULL, hInstance, NULL);
    if (!hWnd)
    {
         MessageBox (NULL, "Window Creation Failed!", "Error!", MB_OK | MB_ICONERROR);
         UnregisterClass (wc.lpszClassName, hInstance);
         return 0;
    }
    
    ShowWindow (hWnd, SW_SHOW);
    UpdateWindow (hWnd);
    
    MSG msg;
    while (GetMessage (&msg, NULL, 0, 0))
    {
         DispatchMessage (&msg);
         TranslateMessage (&msg);
    }
    
    UnregisterClass (wc.lpszClassName, hInstance);
    return (int) msg.wParam;
}
0
0 / 0 / 0
Регистрация: 17.01.2017
Сообщений: 46
22.11.2017, 14:52  [ТС]
Я незнаю что за проблема была в том коде теперь все нормально.
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <math.h>
#include <stdio.h>
using namespace std;
 
/* Globals */
int ScreenX = GetDeviceCaps(GetDC(0), HORZRES);
int ScreenY = GetDeviceCaps(GetDC(0), VERTRES);
BYTE* ScreenData = 0;
 
void ScreenCap()
{
    HDC hScreen = GetDC(0);
    ScreenX = GetDeviceCaps(hScreen, HORZRES);
    ScreenY = GetDeviceCaps(hScreen, VERTRES);
 
    HDC hdcMem = CreateCompatibleDC(hScreen); 
    HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, ScreenX, ScreenY);
    HGDIOBJ hOld = SelectObject(hdcMem, hBitmap);
    BitBlt(hdcMem, 0, 0, ScreenX, ScreenY, hScreen, 0, 0, SRCCOPY);
    SelectObject(hdcMem, hOld);
 
    BITMAPINFOHEADER bmi = { 0 };
    bmi.biSize = sizeof(BITMAPINFOHEADER);
    bmi.biPlanes = 1;
    bmi.biBitCount = 32;
    bmi.biWidth = ScreenX;
    bmi.biHeight = -ScreenY;
    bmi.biCompression = BI_RGB;
    bmi.biSizeImage = 0;// 3 * ScreenX * ScreenY;
 
    if (ScreenData)
        free(ScreenData);
    ScreenData = (BYTE*)malloc(4 * ScreenX * ScreenY);
 
    GetDIBits(hdcMem, hBitmap, 0, ScreenY, ScreenData, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
 
    ReleaseDC(GetDesktopWindow(), hScreen);
    DeleteDC(hdcMem);
    DeleteObject(hBitmap);
}
 
inline int PosB(int x, int y)
{
    return ScreenData[4 * ((y*ScreenX) + x)];
}
 
inline int PosG(int x, int y)
{
    return ScreenData[4 * ((y*ScreenX) + x) + 1];
}
 
inline int PosR(int x, int y)
{
    return ScreenData[4 * ((y*ScreenX) + x) + 2];
}
 
bool ButtonPress(int Key)
{
    bool button_pressed = false;
 
    while (GetAsyncKeyState(Key))
        button_pressed = true;
 
    return button_pressed;
}
 
int main()
{
    FILE * pFile;
    fopen_s(&pFile, "C:/ Users/Арсэн/Documents/Output.txt", "w");
    int A[100][100] = {0};
    while (true)
    {
        if (ButtonPress(VK_SPACE))
        {
            ScreenCap();
            // Print out current cursor position
            POINT p;
            GetCursorPos(&p);
            printf("X:%d Y:%d \n", p.x, p.y);
        //  SetCursorPos(1280, 720);
            // Print out RGB value at that position
            for (int i = p.x; i < p.x+100; i++)
            {
                for (int j = p.y; j < p.y+25; j++)
                {
                    if (PosR(i, j) == 255 && PosR(i, j) == 255 && PosR(i, j) == 255) A[i - p.x][j - p.y] = 1;
                }
            }
            std::cout << "Bitmap: r: " << PosR(p.x, p.y) << " g: " << PosG(p.x, p.y) << " b: " << PosB(p.x, p.y) << "\n";
            for (int i = 0; i < 100; i++)
            {
                for (int j = 0; j < 25; j++)
                {
                    printf("%d", A[i][j]);
                }
                printf("\n");
            }
            
        }
        else if (ButtonPress(VK_ESCAPE))
        {
            printf("Quit\n");
            break;
        }
    }
    
    system("PAUSE");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.11.2017, 14:52
Помогаю со студенческими работами здесь

Очень-очень быстро разряжается Samsung S760
Веер добрый. Такая проблема. Старенькая мыльница стала быстро разряжаться. Раньше можно было снять около 500 фоток, а сейчас в районе...

Греется видеокарта очень сильно и очень быстро
греется видеокарта очень сильно и очень быстро, через 10-20 секунд после включения компа гаснет монитор, иногда это сопроваждается...

Возможно ли создать матрицу int-ов 2000 на 2000?
возможно ли сделать двумерный массив интов 2000 на 2000? int array и заполнить его цифрами например 1 5 50 -12 7476 и так далее

Считать изображение в массив пикселей
Здравствуйте. Нужно изображение .JPG представить по пикселям. Как это можно сделать? С помощью библиотек или вручную.

LSB очень долгое считывание пикселей
реализую метод стеганографии LSB в изображении использую только по одному биту в каждой из цветовых компонент пикселя (RGB) за основу...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru