Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.08.2011, 16:19
Pcrepair
 
Сообщения: n/a
По умолчанию Конвертация BMP 8bit файла в отдельные цветовые файлы

Добрый день!
Нужна программа со следующими возможностями:
- открыть файл BMP 8bit 1600х1200 пик
- определить число используемых цветов в палитре
- сделать из открытого файла, графические файлы BMP 8bit в которых присутствует только один цвет из палитры, все остальные заменены на черный. в общем из одного многоцветного файла сделать много одноцветных, по числу цветов в палитре исходного файла
- записать полученные файлы на ЖД, в том же каталоге, для последующего просмотра

Вопрос: кто нибудь встречал похожие программы написанные на Дельфи? интересно взглянуть на код
Заранее спасибо
Ответить с цитированием
  #2  
Старый 22.08.2011, 20:08
einstein einstein вне форума
Начинающий
 
Регистрация: 02.09.2010
Адрес: Город
Сообщения: 143
Репутация: -4653
По умолчанию

500 руб. Ок?
Ответить с цитированием
  #3  
Старый 22.08.2011, 21:22
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Встречал, стандартный изврат.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #4  
Старый 22.08.2011, 22:19
Pcrepair
 
Сообщения: n/a
По умолчанию

а где посмотреть?
Ответить с цитированием
  #5  
Старый 22.08.2011, 22:21
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Справка + поиск.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #6  
Старый 22.08.2011, 22:27
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Создаём новый файл с палитрой из двух цветов, копируем туда изображение. Через ScanLine или GetDIBits заменяем все не чёрные цвета на новый индекс.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #7  
Старый 22.08.2011, 23:27
Pcrepair
 
Сообщения: n/a
По умолчанию

Вижу, конкретно с кодом будет проблемно - видимо достаточно сложный
тогда обсудим логику работы программы
вариант1
1. открыть файл БМП в каталоге
2. прочитать первый байт массива пикселей (он же последний в файле)
3. перевести в строковую форму значение индекса, записанное в байте
4. открыть новый БМП-файл, записать в него базовый файл, присвоить ему имя взятое из индекса байта пикселя (ну чтобы в имени файла было указание на палитру, не потерялось)
5. сравнить поочередно все пиксели в массиве нового файла со значением первого байта пикселя
если значения равны, тогда сравниваем следующий байт пикселя
если значения не равны, тогда присваиваем байту значение "черный цвет" и идем дальше сравнивать
6. сохраняем на ЖД в том же каталоге с именем к примеру 236.bmp (где 236 - строковое значение индекса байта пикселя)
7. читаем 2-й байт первого файла, зацикливаем это действие, пока не закончатся цвета в палитре
итого имеем на ЖД:
начальный файл
файлы с именем индекса палитры 2-х цветовые, цвет фона черный, и цвет палитры
Получается много много вычислений, вопросы:
- можно приблизительно оценить время выполнения операции при условии что цветов в палитре скажем 150? массив размером 1280х1024 пикс, ну РС = INTEL I5 или 7? что там последнее
- может еще какая логика обработки есть?
Ответить с цитированием
  #8  
Старый 22.08.2011, 23:40
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Pcrepair
Вижу, конкретно с кодом будет проблемно - видимо достаточно сложный
Ну ты, братец, нахал. Так и напрашиваешься, чтобы всё за тебя сделали, а мозгами пошевилить не хочешь.
Слишком ты всё усложнил, задача гооораздо проще, если раньше никто не нарисует тебе код, на досуге напишу. Сейчас слегка занят.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #9  
Старый 23.08.2011, 08:39
Pcrepair
 
Сообщения: n/a
По умолчанию

пока с шевелением мозгов проблемы, любое движение вправо или влево привод к необходимость пару недель изучать что то новое. опыта очень мало

есть еще варианты обработки

можно оптимизировать алгоритм. например не зачем проверять те точки, которые уже точно были проверены при прорисовке 1й картинки. Можно заготовить массив на 256элементов(больше вариантов в 8-бит не должно быть) и при первом проходе раскидать адреса точек, цвет которых совпадает с порядковым номером элемента. а затем рисовать эти массивы.

резервируется массив из 256 8бит изображений, заполняется 0-ми. Потом сканируется исходное изображение и для каждого пиксела ставится 1 для соответствующего пиксела в изображении соответсвующем индексу. Потом для всех использовавшихся изображений создается палитра (2 цвета) и сохраняется на диск.

будет ли так быстрее? и вообще правильнее?
Ответить с цитированием
  #10  
Старый 23.08.2011, 21:20
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Не знаю, это нужно или нет:
Вложения
Тип файла: rar Project1.rar (4.3 Кбайт, 3 просмотров)
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #11  
Старый 23.08.2011, 21:46
Pcrepair
 
Сообщения: n/a
По умолчанию

Спасибо, там много можно изучить

есть еще такой вариант
Код:
procedure TForm1.Button1Click(Sender: TObject);
type
      TPalette = record
        Version: Word;
        NumEntries: Word;
        PalEntry: array [byte] of TPaletteEntry;
      end;
    var
      b,t: TBitmap;
      pal,tpal: TPalette;
      x,y,i: integer;
      max: byte;
      src,dst: pByteArray;
    begin
      b:=TBitmap.Create;
      b.LoadFromFile('test.bmp');
      GetPaletteEntries(b.Palette, 0, 256, pal.PalEntry);
      max:=0;
      for y:=0 to b.Height-1 do begin
        src:=b.ScanLine[y];
        for x:=0 to b.Width-1 do
          if src[x]>max then max:=src[x];
      end;
      t:=TBitmap.Create;
      t.Assign(b);
      tpal.Version:=$0300;
      tpal.NumEntries:=2;
      for i:=0 to max do begin
        tpal.PalEntry[0]:=pal.PalEntry[i];
        pDWORD(@tpal.PalEntry[1])^:=0;
        t.Palette:=CreatePalette(pLogPalette(@tpal)^);
        for y:=0 to t.Height-1 do begin
          src:=b.ScanLine[y];
          dst:=t.ScanLine[y];
          for x:=0 to t.Width-1 do dst[x]:=ord(src[x]<>i);
        end;
        t.SaveToFile(IntToHex(i, 2)+'.bmp');
      end;
      t.Free;
      b.Free;
    end;
единственно не ясно как туда прикрутить pf1bit - сразу конвертацию в 1 битный формат в момент
Код:
t.SaveToFile(IntToHex(i, 2)+'.bmp');
Ответить с цитированием
  #12  
Старый 23.08.2011, 22:03
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

И что ты будешь делать с одноцветным битмапом?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #13  
Старый 23.08.2011, 22:10
Pcrepair
 
Сообщения: n/a
По умолчанию

обрабатывать дальше - выделять символы, для начала 8-и точечным методом
Ответить с цитированием
  #14  
Старый 23.08.2011, 22:16
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

А ну давай пытайся.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:53.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025