powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сохранение произв. bitmap в ч/б (.biPlanes = 1,.biBitCount = 1 ??==.Format1bppIndexed)
4 сообщений из 4, страница 1 из 1
Сохранение произв. bitmap в ч/б (.biPlanes = 1,.biBitCount = 1 ??==.Format1bppIndexed)
    #38911431
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Грубо, имеем m_Bitmap As Bitmap
Формат его может быть любой (т.е. допустима изначально цветная картинка)
Надо его сохранить в файл (TIFF, BMP чего угодно), но именно в черно/белом варианте (.biPlanes = 1,.biBitCount = 1)
Вот стабильный код VB6, который это делает (на примере TIFF):


Код: vbnet
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.
Public Sub SaveFrameAs1bppTIFF( _
 ByVal FileName As String, _
 Optional ByVal nFrame As Long = 0, _
 Optional ByVal DpiX As Single = 0, Optional ByVal DpiY As Single = 0, _
 Optional ByVal dHeightScale As Double = 1, Optional ByVal eTifCompression As TifCompressionType = TiffCompressionNone)
  Dim nSrcWidth As Long
  Dim nSrcHeight As Long
  Dim bmiDst As BITMAPINFO2
  Dim pBits As Long
  Dim hbmDst As Long
  Dim picSrc As IPictureDisp
  Dim hdcDst As Long
  Dim hbmOldDst As Long
  Dim nBitmap As Long
  Dim EncoderCLSID As GUID
  Dim uEncParams  As EncoderParameters
 
  nSrcWidth = FrameWidth(nFrame)
  nSrcHeight = FrameHeight(nFrame)
  With bmiDst.bmiHeader
    .biSize = LenB(bmiDst.bmiHeader)
    .biWidth = nSrcWidth
    .biHeight = nSrcHeight * dHeightScale
    .biPlanes = 1
    .biBitCount = 1
    .biCompression = BI_RGB
  End With
  With bmiDst.bmiColors(1)
    .rgbBlue = 255
    .rgbGreen = 255
    .rgbRed = 255
  End With
  hbmDst = CreateDIBSection(0, bmiDst, DIB_RGB_COLORS, pBits, 0, 0)
 
  hdcDst = CreateCompatibleDC(0)
  hbmOldDst = SelectObject(hdcDst, hbmDst)
 
  Set picSrc = Frame(nFrame)
  picSrc.Render CLng(hdcDst), 0&, CLng(nSrcHeight * dHeightScale), _
   CLng(nSrcWidth), CLng(-nSrcHeight * dHeightScale), _
   0&, 0&, CLng(picSrc.Width), CLng(picSrc.Height), ByVal 0&
  Set picSrc = Nothing
 
  SelectObject hdcDst, hbmOldDst: hbmOldDst = 0
  DeleteDC hdcDst: hdcDst = 0
 
  If GdipExec(GdipCreateBitmapFromGdiDib(bmiDst, pBits, nBitmap)) = OK Then
    If (DpiX > 0) And (DpiY > 0) Then _
     GdipExec GdipBitmapSetResolution(nBitmap, DpiX, DpiY)
       
    'Установка качества
    uEncParams.count = 1
    With uEncParams.Parameter
      ' Setzen der Kompression GUID
      CLSIDFromString StrPtr(EncoderCompression), .GUID
      .NumberOfValues = 1
      .type = [EncoderParameterValueTypeLong]
      .Value = VarPtr(eTifCompression)
    End With
       
    If GetEncoderClsid("image/tiff", EncoderCLSID) >= 0 Then _
     GdipExec GdipSaveImageToFile(nBitmap, StrPtr(FileName), EncoderCLSID, _
     uEncParams)
    GdipExec GdipDisposeImage(nBitmap): nBitmap = 0
  End If
 
  DeleteObject hbmDst: hbmDst = 0: pBits = 0
End Sub

Public Property Get Frame(Optional ByVal nFrame As Long = 0) As IPictureDisp
  Dim hBitmap As Long
  Dim nActiveFrame As Long
  If nFrame = 0 Then
    If m_nBitmap Then
      If GdipExec(GdipCreateHBITMAPFromBitmap(m_nBitmap, hBitmap, 0)) = OK Then
        Set Frame = CreateIPictureDispFromHBITMAP(hBitmap)
      End If
    End If
  ElseIf (nFrame > 0) And (nFrame <= FrameCount) Then
    nActiveFrame = frameIndex
    frameIndex = nFrame
    If GdipExec(GdipCreateHBITMAPFromBitmap(m_nBitmap, hBitmap, 0)) = OK Then
      Set Frame = CreateIPictureDispFromHBITMAP(hBitmap)
    End If
    frameIndex = nActiveFrame
  Else
    Err.Raise 9
  End If
End Property



Пару слов по коду:
чисто средствами GDI++ почему-то не получается, поэтому приходится прибегать к чистому GDI.
Т.е. алгоритм такой:
1) Создается пустой GDI - HBitmap через CreateDIBSection но что важно уже требуемого формата (.biPlanes = 1,.biBitCount = 1).
2) Исходный(возможно цветной) GDI+ m_nBitmap конвертится в GDI - HBitmap через GdipCreateHBITMAPFromBitmap,
а далее преобразуется в IPictureDisp через CreateIPictureDispFromHBITMAP
3) Далее мы используем метод Render (IPictureDisp), т.е. накладываем исходную картинку на DIB-bitmap (созданный в п.1)
4) Далее из GDI - HBitmap создаем новый GDI+ nBitmap через GdipCreateBitmapFromGdiDib,
он автоматом получается того же ч/б формата
5) Ну и этот GDI+ nBitmap сохраняем через GDI+ encoders в чего надо, в данном примере в "image/tiff"

Пытаюсь это переложить на .Net.
Вот мои наработки:
Код: vbnet
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.
  Public Sub SaveFrameAs1bppTIFF( _
   ByVal FileName As String, _
   Optional ByVal nFrame As Integer = 0, _
   Optional ByVal DpiX As Single = 0, Optional ByVal DpiY As Single = 0, _
   Optional ByVal dHeightScale As Double = 1, _
   Optional ByVal eTifCompression As EncoderValue = EncoderValue.CompressionNone)
    Dim nSrcWidth As Integer
    Dim nSrcHeight As Integer
    Dim bmiDst As BITMAPINFO2
    Dim pBits As Integer
    Dim hbmDst As IntPtr
    'Dim picSrc As IPictureDisp
    Dim hdcDst As IntPtr
    Dim hbmOldDst As IntPtr
    Dim nBitmap As Bitmap

    nSrcWidth = FrameWidth(nFrame)
    nSrcHeight = FrameHeight(nFrame)
    With bmiDst.bmiHeader
      .biSize = Marshal.SizeOf(bmiDst.bmiHeader)
      .biWidth = nSrcWidth
      .biHeight = nSrcHeight * dHeightScale
      .biPlanes = 1
      .biBitCount = 1
      .biCompression = BI_RGB
    End With
    With bmiDst.bmiColors1
      .rgbBlue = 255
      .rgbGreen = 255
      .rgbRed = 255
    End With
    hbmDst = CreateDIBSection(IntPtr.Zero, bmiDst, DIB_RGB_COLORS, pBits, IntPtr.Zero, 0)

    hdcDst = CreateCompatibleDC(IntPtr.Zero)
    hbmOldDst = SelectObject(hdcDst, hbmDst)


    'picSrc = Frame(nFrame)
    'picSrc.Render CLng(hdcDst), 0&, CLng(nSrcHeight * dHeightScale), _
    ' CLng(nSrcWidth), CLng(-nSrcHeight * dHeightScale), _
    ' 0&, 0&, CLng(picSrc.Width), CLng(picSrc.Height), ByVal 0&
    'picSrc = Nothing

    SelectObject(hdcDst, hbmOldDst) : hbmOldDst = IntPtr.Zero
    DeleteDC(hdcDst) : hdcDst = IntPtr.Zero

    'Try
    'nBitmap = New Bitmap(nSrcWidth, nSrcHeight * dHeightScale, PixelFormat.Format1bppIndexed)

    'Using gr As Graphics = Graphics.FromImage(nBitmap)
    '  gr.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
    '  gr.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
    '  gr.CompositingQuality = Drawing2D.CompositingQuality.HighQuality

    '  gr.CompositingMode = Drawing2D.CompositingMode.SourceOver
    '  gr.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBilinear
    '  gr.DrawImage(m_Bitmap, 0, 0, nSrcWidth, CInt(nSrcHeight * dHeightScale))
    'End Using


    nBitmap = Bitmap.FromHbitmap(hbmDst)
    If (DpiX > 0) And (DpiY > 0) Then _
     nBitmap.SetResolution(DpiX, DpiY)

    'http://stackoverflow.com/questions/21169217/tiff-file-compression-with-c-sharp
    ' Get an ImageCodecInfo object that represents the TIFF codec.
    Dim myImageCodecInfo As ImageCodecInfo = GetEncoderInfo("image/tiff")
    ' Create an Encoder object based on the GUID for the Compression parameter category.
    Dim myEncoder As Encoder = Encoder.Compression
    ' Create an EncoderParameters object. An EncoderParameters object has an array of EncoderParameter 
    ' objects. In this case, there is only one EncoderParameter object in the array.
    Dim myEncoderParameters As EncoderParameters = New EncoderParameters(1)
    ' Save the bitmap as a TIFF file with eTifCompression compression.
    Dim myEncoderParameter As EncoderParameter = New EncoderParameter(myEncoder, Fix(eTifCompression))
    myEncoderParameters.Param(0) = myEncoderParameter
    nBitmap.Save(FileName, myImageCodecInfo, myEncoderParameters)
    nBitmap.Dispose() : nBitmap = Nothing
    'Catch
    'End Try

    DeleteObject(hbmDst) : hbmDst = IntPtr.Zero : pBits = 0
  End Sub



===
Первый вариант это в лоб.
Естественно GDI+ заменяем на .Net -обертку - в этой части проблем нет, все Encoders и т.п. как по маслу.
Что касается создания ч/б GDI HBitmap здесь тупо повторяем все API (обертки то нету), это понятно.

Нестыкуется средняя часть , т.е. проецирование исходного m_Bitmap as Bitmap на DIB-GDI-Hbitmap
Ну, допустим я .ToHBitmap ему сделаю.
Но я в .Net не располагаю объектом вида IPictureDisp и его методом Render, который собственно и делает быстро все проецирование.
(Ну и не факт что в .Net подобный IPictureDisp интерфейс нужен и есть гуд.)
P.S. Есть еще StretchBlt (чтобы избежать IPictureDisp+Render) если уж идти по этому пути, но я не уверен, что это полный эквивалент и даст такую же производительность как Render.
Как выкручиваться?

===
Второй вариант - пытаться все делать через GDI+.
Но вот такая попытка на дурака:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    nBitmap = New Bitmap(nSrcWidth, nSrcHeight * dHeightScale, PixelFormat.Format1bppIndexed)

    Using gr As Graphics = Graphics.FromImage(nBitmap)
      gr.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
      gr.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
      gr.CompositingQuality = Drawing2D.CompositingQuality.HighQuality

      gr.CompositingMode = Drawing2D.CompositingMode.SourceOver
      gr.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBilinear
      gr.DrawImage(m_Bitmap, 0, 0, nSrcWidth, CInt(nSrcHeight * dHeightScale))
    End Using


мгновенно выдает ошибку:
Невозможно создать объект графики из изображения, имеющего индексированный формат пикселей.
И видимо по этой причине в исходном VB6 все сделано с привлечением GDI а не чисто на GDI+.
Но м.б. все же как-то можно?
...
Рейтинг: 0 / 0
Сохранение произв. bitmap в ч/б (.biPlanes = 1,.biBitCount = 1 ??==.Format1bppIndexed)
    #38911551
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 Нестыкуется средняя часть , т.е. проецирование исходного m_Bitmap as Bitmap на DIB-GDI-Hbitmap
Ну, допустим я .ToHBitmap ему сделаю.
Но я в .Net не располагаю объектом вида IPictureDisp и его методом Render, который собственно и делает быстро все проецирование.
(Ну и не факт что в .Net подобный IPictureDisp интерфейс нужен и есть гуд.)
P.S. Есть еще StretchBlt (чтобы избежать IPictureDisp+Render) если уж идти по этому пути, но я не уверен, что это полный эквивалент и даст такую же производительность как Render.
Как выкручиваться?

Ну вроде сделал через StretchBlt:

Код: vbnet
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.
    Dim hbmSrc As IntPtr = Frame(nFrame)
    Dim hdcSrc As IntPtr = CreateCompatibleDC(IntPtr.Zero)
    Dim hbmOldSrc As IntPtr = SelectObject(hdcSrc, hbmSrc)

    StretchBlt(hdcDst, 0, 0, nSrcWidth, CInt(nSrcHeight * dHeightScale), _
     hdcSrc, 0, 0, nSrcWidth, nSrcHeight, SRCCOPY)

    SelectObject(hdcSrc, hbmOldSrc) : hbmOldSrc = IntPtr.Zero
    DeleteDC(hdcSrc) : hdcSrc = IntPtr.Zero
    DeleteObject(hbmSrc)


    'picSrc.Render CLng(hdcDst), 0&, CLng(nSrcHeight * dHeightScale), _
    ' CLng(nSrcWidth), CLng(-nSrcHeight * dHeightScale), _
    ' 0&, 0&, CLng(picSrc.Width), CLng(picSrc.Height), ByVal 0&
    'picSrc = Nothing

    SelectObject(hdcDst, hbmOldDst) : hbmOldDst = IntPtr.Zero
    DeleteDC(hdcDst) : hdcDst = IntPtr.Zero
...

  Public ReadOnly Property Frame(Optional ByVal nFrame As Integer = 0) As IntPtr
    Get
      Dim nActiveFrame As Integer
      If nFrame = 0 Then
        If Not m_Bitmap Is Nothing Then
          Try : Return m_Bitmap.GetHbitmap : Catch : End Try
        End If
      ElseIf (nFrame > 0) And (nFrame <= FrameCount) Then
        nActiveFrame = frameIndex
        frameIndex = nFrame
        Try : Return m_Bitmap.GetHbitmap : Catch : End Try
        frameIndex = nActiveFrame
      End If
      Return IntPtr.Zero
    End Get
  End Property



Вроде делает то что надо.
Но у меня таки вопрос, м.б. кто в курсе

IpictureDisp + метод Render
это тоже самое что
StretchBlt + SRCCOPY ???


Потому что счас оставлю а потом окажется что совсем не то, и картинки гадятся.
Еще оговорюсь что в данном случае никаких HALFTONE режимов я не использую (это насчет гадятся),
исходные картинки - всегда ч/б TIFF, размер если и меняю, то сжатие-растяжение в 2 раза.
А нужно именно контролировать 2 цвета чтобы из 2-х цветного TIFF не генерировался 32-битный bmp или jpeg при конвертации,
а GDI+ это именно делает по дефолту при сохранении файла.
...
Рейтинг: 0 / 0
Сохранение произв. bitmap в ч/б (.biPlanes = 1,.biBitCount = 1 ??==.Format1bppIndexed)
    #38912490
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без (StretchBlt + SRCCOPY) / (IpictureDisp + метод Render) можно обойтись как и без конвертации исходного GDI+ Bitmap в GDI-Bitmap / IpictureDisp.
Покопался в своих старых кодах...
Т.е. я не могу через GDI+ рисовать поверх GDI+-bitmap, если он в формате .Format1bppIndexed
Но никто мне не мешает рисовать этим (GDI+) методом поверх hdc, взятого из GDI-рисунка (biPlanes = 1,.biBitCount = 1).

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    hbmDst = CreateDIBSection(IntPtr.Zero, bmiDst, DIB_RGB_COLORS, pBits, IntPtr.Zero, 0)

    hdcDst = CreateCompatibleDC(IntPtr.Zero)
    hbmOldDst = SelectObject(hdcDst, hbmDst)

    bitmapSrc = Frame(nFrame)
    If Not bitmapSrc Is Nothing Then
      Using gr As Graphics = Graphics.FromHdc(hdcDst)
        gr.DrawImage(bitmapSrc, 0, 0, nSrcWidth, CInt(nSrcHeight * dHeightScale))
      End Using
      bitmapSrc.Dispose()
    End If

    SelectObject(hdcDst, hbmOldDst) : hbmOldDst = IntPtr.Zero
    DeleteDC(hdcDst) : hdcDst = IntPtr.Zero



А вот без GDI-рисунка похоже не обойтись, хотя я и видел решение, когда рисуют поверх цветного GDI+ рисунка, а потом по пикселям копируют его в .Format1bppIndexed-bitmap, но это фигово и долго - каждый пиксель анализировать.

Ну, т.е. остановился на таком конечном варианте:


Код: vbnet
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.
  Public Sub SaveFrameAs1bppTIFF( _
   ByVal FileName As String, _
   Optional ByVal nFrame As Integer = 0, _
   Optional ByVal DpiX As Single = 0, Optional ByVal DpiY As Single = 0, _
   Optional ByVal dHeightScale As Double = 1, _
   Optional ByVal eTifCompression As EncoderValue = EncoderValue.CompressionNone)
    Dim nSrcWidth As Integer
    Dim nSrcHeight As Integer
    Dim bmiDst As BITMAPINFO2
    Dim pBits As Integer
    Dim hbmDst As IntPtr
    Dim bitmapSrc As Bitmap
    Dim hdcDst As IntPtr
    Dim hbmOldDst As IntPtr
    Dim nBitmap As Bitmap

    nSrcWidth = FrameWidth(nFrame)
    nSrcHeight = FrameHeight(nFrame)

    With bmiDst.bmiHeader
      .biSize = Marshal.SizeOf(bmiDst.bmiHeader)
      .biWidth = nSrcWidth
      .biHeight = CInt(nSrcHeight * dHeightScale)
      .biPlanes = 1
      .biBitCount = 1
      .biCompression = BI_RGB
    End With
    With bmiDst.bmiColors1
      .rgbBlue = 255
      .rgbGreen = 255
      .rgbRed = 255
    End With
    hbmDst = CreateDIBSection(IntPtr.Zero, bmiDst, DIB_RGB_COLORS, pBits, IntPtr.Zero, 0)

    hdcDst = CreateCompatibleDC(IntPtr.Zero)
    hbmOldDst = SelectObject(hdcDst, hbmDst)

    bitmapSrc = Frame(nFrame)
    If Not bitmapSrc Is Nothing Then
      Using gr As Graphics = Graphics.FromHdc(hdcDst)
        gr.DrawImage(bitmapSrc, 0, 0, nSrcWidth, CInt(nSrcHeight * dHeightScale))
      End Using
      bitmapSrc.Dispose()
    End If

    SelectObject(hdcDst, hbmOldDst) : hbmOldDst = IntPtr.Zero
    DeleteDC(hdcDst) : hdcDst = IntPtr.Zero

    Try
      nBitmap = Bitmap.FromHbitmap(hbmDst)
      If (DpiX > 0) And (DpiY > 0) Then nBitmap.SetResolution(DpiX, DpiY)

      'http://stackoverflow.com/questions/21169217/tiff-file-compression-with-c-sharp
      ' Get an ImageCodecInfo object that represents the TIFF codec.
      Dim myImageCodecInfo As ImageCodecInfo = GetEncoderInfo("image/tiff")
      ' Create an Encoder object based on the GUID for the Compression parameter category.
      Dim myEncoder As Encoder = Encoder.Compression
      ' Create an EncoderParameters object. An EncoderParameters object has an array of EncoderParameter 
      ' objects. In this case, there is only one EncoderParameter object in the array.
      Dim myEncoderParameters As EncoderParameters = New EncoderParameters(1)
      ' Save the bitmap as a TIFF file with eTifCompression compression.
      Dim myEncoderParameter As EncoderParameter = New EncoderParameter(myEncoder, Fix(eTifCompression))
      myEncoderParameters.Param(0) = myEncoderParameter
      nBitmap.Save(FileName, myImageCodecInfo, myEncoderParameters)
      nBitmap.Dispose() : nBitmap = Nothing
    Catch
    End Try

    DeleteObject(hbmDst) : hbmDst = IntPtr.Zero : pBits = 0
  End Sub

  Public ReadOnly Property Frame(Optional ByVal nFrame As Integer = 0) As Bitmap
    Get
      Dim nActiveFrame As Integer
      Frame = Nothing
      If nFrame = 0 Then
        If Not m_Bitmap Is Nothing Then
          Try : Frame = New Bitmap(m_Bitmap) : Catch : End Try
        End If
      ElseIf (nFrame > 0) And (nFrame <= FrameCount) Then
        nActiveFrame = frameIndex
        frameIndex = nFrame
        Try : Frame = New Bitmap(m_Bitmap) : Catch : End Try
        frameIndex = nActiveFrame
      End If
    End Get
  End Property



Жаль что никто так и не подсказал ничего.
Обертка GDI+ (System.Drawing) в .Net достаточно хорошо реализована.
...
Рейтинг: 0 / 0
Сохранение произв. bitmap в ч/б (.biPlanes = 1,.biBitCount = 1 ??==.Format1bppIndexed)
    #38912512
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну если получилось, то - пожалуйста!
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сохранение произв. bitmap в ч/б (.biPlanes = 1,.biBitCount = 1 ??==.Format1bppIndexed)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]