powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Кто писал свои функции для работы с BMP-файлами?
14 сообщений из 14, страница 1 из 1
Кто писал свои функции для работы с BMP-файлами?
    #33554721
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть картинка (приложена). Картинка тестовая.

Пытаюсь прочитать из неё столбец пикселей. Вычитал, что информация записанна по строкам вверх ногами.

Я реализовал такой алгоритм:
сместится с начала файла на величину равную bfOffBits + номер столбца который будем читать * 3 (работаем только с 24 файлами, поэтому 3 байта на пиксель). 

Прочитать 3 байта. Обработать.
Сместится на величину равную ширине файла (biWidth) * 3 + biWidth % 4/
Прочитать 3 байта.
Повторять пока не упрёмся в верх картинки.

Но получается фигня какая-то.

Вот прога:

Код: plaintext
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.
import struct, os


class BMPImage:
    filename = "" # Имя файл входного изображения
    f = '' # файл входного изображения
    bmpFileHeaderAsByte = ''# bmpFileHeader
    bmpInfoHeaderAsByte = ''# bmpInfoHeader
    bmpFileHeader = {}# bmpFileHeader
    bmpInfoHeader = {}# bmpInfoHeader


    def __init__(self, filename):
        self.filename = filename
        self.f = open(filename, 'rwb')
        self.bmpFileHeaderAsByte = self.f.read( 14 ) #Здесь начинается чтение хедера. За информацией обратитесь к описанию формата BMP

        self.bmpFileHeader["bfType"] = self.bmpFileHeaderAsByte[ 0 : 2 ]
        self.bmpFileHeader["bfSize"] = struct.unpack('I', self.bmpFileHeaderAsByte[ 2 : 6 ])[ 0 ]
        self.bmpFileHeader["bfReserved1"] = struct.unpack('H', self.bmpFileHeaderAsByte[ 6 : 8 ])[ 0 ]
        self.bmpFileHeader["bfReserved2"] = struct.unpack('H', self.bmpFileHeaderAsByte[ 8 : 10 ])[ 0 ]
        self.bmpFileHeader["bfOffBits"] = struct.unpack('I', self.bmpFileHeaderAsByte[ 10 : 14 ])[ 0 ]

        self.bmpInfoHeaderAsByte = self.f.read( 40 )
        self.bmpInfoHeader["biSize"] = struct.unpack('I', self.bmpInfoHeaderAsByte[ 0 : 4 ])[ 0 ]
        self.bmpInfoHeader["biWidth"] = struct.unpack('I', self.bmpInfoHeaderAsByte[ 4 : 8 ])[ 0 ]
        self.bmpInfoHeader["biHeight"] = struct.unpack('I', self.bmpInfoHeaderAsByte[ 8 : 12 ])[ 0 ]
        self.bmpInfoHeader["biPlanes"] = struct.unpack('H', self.bmpInfoHeaderAsByte[ 12 : 14 ])[ 0 ]
        self.bmpInfoHeader["biBitCount"] = struct.unpack('H', self.bmpInfoHeaderAsByte[ 14 : 16 ])[ 0 ]
        self.bmpInfoHeader["biCompression"] = struct.unpack('I', self.bmpInfoHeaderAsByte[ 16 : 20 ])[ 0 ]
        self.bmpInfoHeader["biSizeImage"] = struct.unpack('I', self.bmpInfoHeaderAsByte[ 20 : 24 ])[ 0 ]
        self.bmpInfoHeader["biXPelsPerMeter"] = struct.unpack('I', self.bmpInfoHeaderAsByte[ 24 : 28 ])[ 0 ]
        self.bmpInfoHeader["biYPelsPerMeter"] = struct.unpack('I', self.bmpInfoHeaderAsByte[ 28 : 32 ])[ 0 ]
        self.bmpInfoHeader["biClrUsed"] = struct.unpack('I', self.bmpInfoHeaderAsByte[ 32 : 36 ])[ 0 ]
        self.bmpInfoHeader["biClrImportant"] = struct.unpack('I', self.bmpInfoHeaderAsByte[ 36 : 40 ])[ 0 ]

        # Здесь будем проверять файл на валидность.
        if self.bmpFileHeader["bfType"] != "BM": raise TypeError, "Not BMP image"
        if self.bmpFileHeader["bfSize"] != os.path.getsize(self.filename): raise TypeError, "BMP File size not valid"
        if self.bmpInfoHeader["biBitCount"] !=  24 : raise TypeError, "BMP color depth must bi 24 bits"

        

    def getColumn(self, n =  1 ):
        n -=  1 
        column = [] # столбец пикселей. Будет содержать словари типа {r: g: b:}
        self.f.seek( 3  * n + self.bmpFileHeader["bfOffBits"],  0 ) #
        for i in range(self.bmpInfoHeader["biHeight"]):
            bytes = self.f.read( 3 )
            print i
            if i != self.bmpInfoHeader["biHeight"] -  1 : self.f.seek( 3  * n + \
                                                                    i * self.bmpInfoHeader["biWidth"] -  1  + \
                                                                    self.bmpInfoHeader["biWidth"] %  40 )
            column.append({'b': struct.unpack('B', bytes[ 0 ])[ 0 ],\
                           'g': struct.unpack('B', bytes[ 1 ])[ 0 ],\
                           'r': struct.unpack('B', bytes[ 2 ])[ 0 ]})



        #bytes = self.f.read(self.bmpInfoHeader["biHeight"] *  3 )
        #j =  0 ; 
        #for i in range( 0 , self.bmpInfoHeader["biHeight"] *  33 ): column.append({'b': struct.unpack('B', bytes[i])[ 0 ], 'g': struct.unpack('B', bytes[i +  1 ])[ 0 ], 'r': struct.unpack('B', bytes[i +  2 ])[ 0 ]})
        return column

r = raw_input()

img = BMPImage(r)
print img.bmpFileHeader
print img.bmpInfoHeader


coll = img.getColumn( 10 )
for i in coll: print '10', i

Вот что она выдаёт при чтёнии 10 столбца:

10 {'r': 253, 'b': 251, 'g': 251}
10 {'r': 0, 'b': 24, 'g': 0}
10 {'r': 0, 'b': 18, 'g': 11}
10 {'r': 0, 'b': 0, 'g': 0}
10 {'r': 255, 'b': 1, 'g': 255}

А должно быть всё белым!
...
Рейтинг: 0 / 0
Кто писал свои функции для работы с BMP-файлами?
    #33554747
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К библиотекам не отсылать!

Ещё вопрос из области арихметики:
вес каритнки тестовой должна получаться (10 * 3 + 2) * 5 + 54 = 214 байт.

А она 216!
...
Рейтинг: 0 / 0
Кто писал свои функции для работы с BMP-файлами?
    #33554775
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Действительно картинка записана вверх ногами.

Примерный код, выдран из рабочего, после выдирания не проверен, но идея понятна.
Читает из 2,16,256 цветного некомпрессированного БМП файла и записывает в массив байт img.arr по одному пикселу в байт.

В документации что-то говорилось о выравнивании границы картинки в случае 2 и 16 цветов, если она не попадает на целое число байт, но уже не помню что. По-моему это учитывается в строчках:
bw = bfh.biszim/bfh.bihigh; /* width of the image */
и
bfx += bw;


Код: plaintext
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.
typedef struct {
  ushort bftype;
  ulong bfsize;              /* size of the file */
  ushort res1,res2;
  ulong bfoffs, bisize,      /* offset & width in bytes of the image in the file */
                biwidth, bihigh;     /* width & height in pixels  */
  ushort biplanes, bibitcount;   /* ???, bits/color */
  ulong  bicompr, biszim;        /* 0 if image not compressed, size of the image in the file */
  } bitmapfileheader; /* sizeof bitmapfileheader = 38 */

int bmpread() {
  static byte bmphd[ 4096 ]; /* bfh.bfoffs<512 */
  static bitmapfileheader bfh; /* sizeof bitmapfileheader = 38 */
  int ir, ir0, ntsk, i= 0 ;
  ulong j0, bw, iwr, ihr;
  byte *bff, bfx;
  FILE *fl;

  if ((fl=fopen(flnm,"rb"))==NULL) {sprintf(errtext,errm,flnm); return ERR;}
  ir=fread((void *) bmphd, 1 , 38 ,fl)
  bfh.bftype    =(ushort)  rdLong(pb,i, 2 ); i+= 2 ; //читает  2  байта из little endian последовательности байт
  bfh.bfsize    =(ulong)   rdLong(pb,i, 4 ); i+= 4 ; //читает  4  байта из little endian последовательности байт
  bfh.res1      =(ushort)  rdL(pb,i, 2 ); i+= 2 ;
  bfh.res2      =(ushort)  rdL(pb,i, 2 ); i+= 2 ;
  bfh.bfoffs    =(ulong)   rdL(pb,i, 4 ); i+= 4 ;
  bfh.bisize    =(ulong)   rdL(pb,i, 4 ); i+= 4 ;
  bfh.biwidth   =(ulong)   rdL(pb,i, 4 ); i+= 4 ;
  bfh.bihigh    =(ulong)   rdL(pb,i, 4 ); i+= 4 ;
  bfh.biplanes  =(ushort)  rdL(pb,i, 2 ); i+= 2 ;  
  bfh.bibitcount=(ushort)  rdL(pb,i, 2 ); i+= 2 ;  
  bfh.bicompr   =(ulong)   rdL(pb,i, 4 ); i+= 4 ;
  bfh.biszim    =(ulong)   rdL(pb,i, 4 ); i+= 4 ;

  ir=fread((void *)(bmphd+ir), 1 ,(unsigned) (bfh.bfoffs-ir),fl);
  if (ir==- 1  || ir< 38 ) {sprintf(errtext,errm,flnm); return ERR;}

  if (bfh.bicompr) {
      sprintf(errtext,"Error: compressed file: %s \n",flnm);
      fclose(fl);     
      return ERR;
  }
  if (bfh.bibitcount >  8 ) {
      sprintf(errtext,"Error: too many colors in file: %s \n",flnm);
      fclose(fl);     
      return ERR;
  }

  /* space for the bitmap */
  if ((bff=bfx=(byte *) calloc((size_t) bfh.biszim, 1 ))==NULL) {
      sprintf(errtext,"Not enough memory for file input\n");
      fclose(fl);     
      return ERR;
  }
  
  fread((void *)(bmphd+ir), 1 ,(unsigned) (bfh.bfoffs-ir),fl);
  fread((void *) bfx, 1 ,(unsigned) bfh.biszim,fl);
  fclose(fl);     

  iwr=bfh.biwidth; ihr=bfh.bihigh;
  bw = bfh.biszim/bfh.bihigh; /* the width of the image */
  bfx=bff;
  for (j0 = iwr*iwh; j0 >= iwr;){
    j0 -= iwr; jj=j0;
    switch (bfh.bibitcount){
      case  1 :
        for (i= 0 ; i<iwr/ 8 ; i++, jj+= 8 )
          for (j= 0 ; j< 8 ; j++) img.arr[jj+ 7 -j]=(bfx[i]&( 1 <<j))? 1 : 0 ;
        break;
      case  4 :
        for (i= 0 ; i<iwr/ 2 ; i++, jj+= 2 ){
          img.arr[jj]=bfx[i]/0x10; img.arr[jj+ 1 ]=bfx[i]%0x10; /* hi, lo */
        }
        break;
      case  8 :
        for (i= 0 ; i<iwr; i++) img.arr[jj+i]=bfx[i];
        break;
      }
    bfx += bw;
  }
  free(bff);
  return OK;
}

ulong rdL(byte *b, uint i0, uint nb){
  ulong l= 0 , l10= 1 ;
  uint i;
  for (i=i0; i<i0+nb; i++) {
    l+=((ulong)b[i])*l10;
    l10*=0x100;
  }
  return l;
}

...
Рейтинг: 0 / 0
Кто писал свои функции для работы с BMP-файлами?
    #33554776
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Виноват, вместо "for (j0 = iwr*iwh; j0 >= iwr;)" следует читать "for (j0 = iwr*ihr; j0 >= iwr;)"
...
Рейтинг: 0 / 0
Кто писал свои функции для работы с BMP-файлами?
    #33555093
neskif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinЕсть картинка (приложена). Картинка тестовая.
Пытаюсь прочитать из неё столбец пикселей. Вычитал, что информация записанна по строкам вверх ногами.
Не понял тебя, что значит по строкам вверх ногами ? Вся информация хранится в капутере в виде одной большой строки, т.е. независимо от того матрица это или картинка, сначала идет первая строка, вслед за ней идет вторая и т.д. А разбиение на столбцы и другие фигуры программер должен сам программно организовывать.
И еще тебе надо ознакомиться с форматом bmp. Картинки хрянятся в большом количестве форматов и каждый их них вполне специфически организован.
Ты должен исходить из строки и формата BMP. Желаю удачи.
...
Рейтинг: 0 / 0
Кто писал свои функции для работы с BMP-файлами?
    #33557026
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
neskif
Не понял тебя, что значит по строкам вверх ногами ? Вся информация хранится в капутере в виде одной большой строки, т.е. независимо от того матрица это или картинка, сначала идет первая строка, вслед за ней идет вторая и т.д. А разбиение на столбцы и другие фигуры программер должен сам программно организовывать.
И еще тебе надо ознакомиться с форматом bmp. Картинки хрянятся в большом количестве форматов и каждый их них вполне специфически организован.
Ты должен исходить из строки и формата BMP. Желаю удачи.
Спасибо за столь ёмкое наставление.

Я ознакомился с форматом BMP. Прога будет работать с 24 бит на пиксель. Без палитры. Про одну большую строку знаю. Возникает всего один маленький вопрос: по сколько байт приходится на одну строку? Как это выщитать?
...
Рейтинг: 0 / 0
Кто писал свои функции для работы с BMP-файлами?
    #33557045
neskif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sarin Я ознакомился с форматом BMP. Прога будет работать с 24 бит на пиксель. Без палитры. Про одну большую строку знаю. Возникает всего один маленький вопрос: по сколько байт приходится на одну строку? Как это выщитать?
Надо понять сколько пикселов в строке, а дальше все подсчитывается.
...
Рейтинг: 0 / 0
Кто писал свои функции для работы с BMP-файлами?
    #33557057
Doktor Gradus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если у вас 24 бита на пиксель, значит 3 байта на точку. Следовательно в "строке" из N символов N/3 пикселей. При разрешении картинки в 640х480х24bit получается 480 "строк" по 1440 символов (480*3).
...
Рейтинг: 0 / 0
Кто писал свои функции для работы с BMP-файлами?
    #33557135
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё. Я разобрался.

Длинна строки выравнивается так, чтоб быть кратной 4. Тоесть ширина строки + остаток деления ширины на 4.

Смещение до следующего пикселя из столбца n считается так:
offset = self.bmpFileHeader["bfOffBits"] + n * 3 + (self.bmpInfoHeader["biWidth"]) * 3 * i + (self.bmpInfoHeader["biWidth"] % 4) * i

Где i - номер строки до которой мы добрались.

Вот класс, если кому интересно. Язык - питон.

Код: plaintext
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.
import struct, os


class BMPImage:
    filename = "" # Имя файл входного изображения
    f = '' # файл входного изображения
    bmpFileHeaderAsByte = ''# bmpFileHeader
    bmpInfoHeaderAsByte = ''# bmpInfoHeader
    bmpFileHeader = {}# bmpFileHeader
    bmpInfoHeader = {}# bmpInfoHeader


    def __init__(self, filename):
        self.filename = filename
        self.f = open(filename, 'rwb')
        self.bmpFileHeaderAsByte = self.f.read( 14 ) #Здесь начинается чтение хедера. За информацией обратитесь к описанию формата BMP

        self.bmpFileHeader["bfType"] = self.bmpFileHeaderAsByte[ 0 : 2 ]
        self.bmpFileHeader["bfSize"] = struct.unpack('I', self.bmpFileHeaderAsByte[ 2 : 6 ])[ 0 ]
        self.bmpFileHeader["bfReserved1"] = struct.unpack('H', self.bmpFileHeaderAsByte[ 6 : 8 ])[ 0 ]
        self.bmpFileHeader["bfReserved2"] = struct.unpack('H', self.bmpFileHeaderAsByte[ 8 : 10 ])[ 0 ]
        self.bmpFileHeader["bfOffBits"] = struct.unpack('I', self.bmpFileHeaderAsByte[ 10 : 14 ])[ 0 ]

        self.bmpInfoHeaderAsByte = self.f.read( 40 )
        self.bmpInfoHeader["biSize"] = struct.unpack('I', self.bmpInfoHeaderAsByte[ 0 : 4 ])[ 0 ]
        self.bmpInfoHeader["biWidth"] = struct.unpack('I', self.bmpInfoHeaderAsByte[ 4 : 8 ])[ 0 ]
        self.bmpInfoHeader["biHeight"] = struct.unpack('I', self.bmpInfoHeaderAsByte[ 8 : 12 ])[ 0 ]
        self.bmpInfoHeader["biPlanes"] = struct.unpack('H', self.bmpInfoHeaderAsByte[ 12 : 14 ])[ 0 ]
        self.bmpInfoHeader["biBitCount"] = struct.unpack('H', self.bmpInfoHeaderAsByte[ 14 : 16 ])[ 0 ]
        self.bmpInfoHeader["biCompression"] = struct.unpack('I', self.bmpInfoHeaderAsByte[ 16 : 20 ])[ 0 ]
        self.bmpInfoHeader["biSizeImage"] = struct.unpack('I', self.bmpInfoHeaderAsByte[ 20 : 24 ])[ 0 ]
        self.bmpInfoHeader["biXPelsPerMeter"] = struct.unpack('I', self.bmpInfoHeaderAsByte[ 24 : 28 ])[ 0 ]
        self.bmpInfoHeader["biYPelsPerMeter"] = struct.unpack('I', self.bmpInfoHeaderAsByte[ 28 : 32 ])[ 0 ]
        self.bmpInfoHeader["biClrUsed"] = struct.unpack('I', self.bmpInfoHeaderAsByte[ 32 : 36 ])[ 0 ]
        self.bmpInfoHeader["biClrImportant"] = struct.unpack('I', self.bmpInfoHeaderAsByte[ 36 : 40 ])[ 0 ]

        # Здесь будем проверять файл на валидность.
        if self.bmpFileHeader["bfType"] != "BM": raise TypeError, "Not BMP image"
        if self.bmpFileHeader["bfSize"] != os.path.getsize(self.filename): raise TypeError, "BMP File size not valid"
        if self.bmpInfoHeader["biBitCount"] !=  24 : raise TypeError, "BMP color depth must bi 24 bits"

        

    def getColumn(self, n =  1 ):
        n -=  1 
        column = [] # столбец пикселей. Будет содержать словари типа {r: g: b:}
        offset =  0 
        
        self.f.seek( 860 )
        bytes = self.f.read( 3 )
        print struct.unpack('B', bytes[ 0 ])[ 0 ], struct.unpack('B', bytes[ 1 ])[ 0 ], struct.unpack('B', bytes[ 2 ])[ 0 ]

        for i in range(self.bmpInfoHeader["biHeight"]):
            offset = self.bmpFileHeader["bfOffBits"] + n *  3 \
                  + (self.bmpInfoHeader["biWidth"]) *  3  * i +\
                  (self.bmpInfoHeader["biWidth"] %  4 ) * i
            self.f.seek(offset,  0 )
            bytes = self.f.read( 3 )
            if i != self.bmpInfoHeader["biHeight"] -  1 : self.f.seek( 3  * n + \
                                                                    i * self.bmpInfoHeader["biWidth"] -  1  + \
                                                                    self.bmpInfoHeader["biWidth"] %  40 )
            column.append({'b': struct.unpack('B', bytes[ 0 ])[ 0 ],\
                           'g': struct.unpack('B', bytes[ 1 ])[ 0 ],\
                           'r': struct.unpack('B', bytes[ 2 ])[ 0 ]})



        return column

r = raw_input()

img = BMPImage(r)
print img.bmpFileHeader
print img.bmpInfoHeader


coll = img.getColumn( 3 )
for i in coll: print i



...
Рейтинг: 0 / 0
Кто писал свои функции для работы с BMP-файлами?
    #33557145
neskif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sarin Всё. Я разобрался.
Молодец ! Возьми с полочки пирожок.
...
Рейтинг: 0 / 0
Кто писал свои функции для работы с BMP-файлами?
    #33557210
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Doktor Gradusесли у вас 24 бита на пиксель, значит 3 байта на точку. Следовательно в "строке" из N символов N/3 пикселей. При разрешении картинки в 640х480х24bit получается 480 "строк" по 1440 символов (480*3).

А еще бывает компрессированный формат.
...
Рейтинг: 0 / 0
Кто писал свои функции для работы с BMP-файлами?
    #33559433
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c127 Doktor Gradusесли у вас 24 бита на пиксель, значит 3 байта на точку. Следовательно в "строке" из N символов N/3 пикселей. При разрешении картинки в 640х480х24bit получается 480 "строк" по 1440 символов (480*3).

А еще бывает компрессированный формат.
Прога пишется под заказчика. Я могу выставить требование использовать формат, который мне удобен.
...
Рейтинг: 0 / 0
Кто писал свои функции для работы с BMP-файлами?
    #33559502
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sarin c127 Doktor Gradusесли у вас 24 бита на пиксель, значит 3 байта на точку. Следовательно в "строке" из N символов N/3 пикселей. При разрешении картинки в 640х480х24bit получается 480 "строк" по 1440 символов (480*3).

А еще бывает компрессированный формат.
Прога пишется под заказчика. Я могу выставить требование использовать формат, который мне удобен.
Я понял, мое замечание о том, что предложенный подсчет байт не всегда правильный.
...
Рейтинг: 0 / 0
Кто писал свои функции для работы с BMP-файлами?
    #33559570
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасиб. Я знаю.

Если применена компрессия будет порождено исключение.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Кто писал свои функции для работы с BMP-файлами?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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