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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2012, 04:24   #1
palochka
Пользователь
 
Регистрация: 02.05.2009
Сообщений: 18
Восклицание bmp в массив

Нужно представить черно-белую картинку(отсканированные текст) в массив 0 и 1( где 1-черный пиксель,0-белый пиксель).Результат записываю в файл.
Код работает, но почему то в итоге в файле картина не полностью, только ее часть. Не зависит от размер картинки. Даже если маленькая -то все равно часть отображается. В чем может быть дело?

Код:
bmp1:=TBitmap.Create;
bmp1.LoadFromFile(Img);
SetLength(MasY,bmp1.Height);

assignfile(fv,'f1.txt'); 
 rewrite(fv);  

for j := 0 to bmp1.Height - 1 do
  begin                  
    MasY[j]:= bmp1.ScanLine[j];
end;
 
  for i:=0 to bmp1.Height - 1 do                   
       begin
        for j:=0 to bmp1.Width - 1 do  begin
          if MasY[i,j]<160 then begin
            write(fv,'1');end   else   write(fv,'0');
          end;
       write(fv,#13#10);
  end;
 closefile(fv);
Исходный файл


Вот что у меня получается

Последний раз редактировалось palochka; 01.06.2012 в 04:32.
palochka вне форума Ответить с цитированием
Старый 01.06.2012, 07:33   #2
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Просто вы выделяете мало места, вот и не вся картинка сохраняется.
Попробуйте выделять не просто Height,a Height*Width.
Правда, сначала хотелось бы увидеть какого типа переменная MasY.
И узнать, какая глубина цвета у изображения?
Чтобы узнать глубину цвета, после LoadFromFile() напишите showmessage(inttostr(bmp1.PixelForm at));
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 01.06.2012, 09:10   #3
palochka
Пользователь
 
Регистрация: 02.05.2009
Сообщений: 18
По умолчанию

var MasY:array of Pbytearray;

Пишет ошибка. Inttostr не может быть вызван с этими аргументом
Код:
 showmessage(inttostr(bmp1.PixelFormat));
Но в инфе о картинке указана глубина цвета 24.

Пыталась выделять больше памяти, как вы сказали .Ничего не меняется. Видимо надо еще где то подправить. Не могу сообразить

Код:
SetLength(MasY,bmp1.Height*bmp1.Width);
SetLength(MasY,bmp1.Height*bmp1.Width*3);// И так тоже ничего не меняется
palochka вне форума Ответить с цитированием
Старый 01.06.2012, 14:47   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,316
По умолчанию

Код:
var
  bmp1: tbitmap;
  ls: tstringlist;
  Img, s: string;
  i, j: integer;
  c: tcolor;

begin
  img := '1.bmp';
  c := rgb(160, 160, 160);
  ls := tstringlist.create;
  bmp1 := TBitmap.Create;
  bmp1.LoadFromFile(Img);
  for i := 0 to bmp1.Height - 1 do
  begin
    s := '';
    for j := 0 to bmp1.Width - 1 do  
    begin
      if bmp1.canvas.pixels[j, i] < c then
        s := s + '1' else s := s + '0';
    end;
    ls.Add(s);
  end;
  ls.SaveToFile(img + '.txt');
  bmp1.Free;
  ls.Free;
end;
Вот так у меня работает.
Конечно, при использовании scanline можно получить ускорение, но, имхо, это не критично, по крайней мере, при такой обработке данных.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 01.06.2012, 15:22   #5
palochka
Пользователь
 
Регистрация: 02.05.2009
Сообщений: 18
По умолчанию

Спасибо огромное!!!!! Сейчас буду пробывать!!!!

Урааа!!!Работает!!!!!!!!!!

Последний раз редактировалось palochka; 01.06.2012 в 15:40.
palochka вне форума Ответить с цитированием
Старый 01.06.2012, 20:02   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

При глубине цвета 24 бита на один цвет нужно 3 байта, т.е. объем памяти, выделяемой под строку, должен втрое превосходить ее длину в пикселях.
s-andriano вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Наложить BMP на BMP. sergeyrulit Общие вопросы Delphi 6 05.03.2015 13:41
С# задан массив 5х5. сформировать массивы А и В. в массив А поместить элементы с четными индексами, в массив В с нечетны Koksa Помощь студентам 0 10.10.2011 11:26
Загрузка BMP в Simple Graph и сохранение в BMP формат artemavd Общие вопросы Delphi 10 02.10.2010 14:19
BMP в массив fen1ksss Мультимедиа в Delphi 21 21.09.2010 01:22
Как загрузить BMP в массив и обратно в С++ Ilja Общие вопросы C/C++ 8 07.03.2009 23:48