![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Добрый день!
Нужна программа со следующими возможностями: - открыть файл BMP 8bit 1600х1200 пик - определить число используемых цветов в палитре - сделать из открытого файла, графические файлы BMP 8bit в которых присутствует только один цвет из палитры, все остальные заменены на черный. в общем из одного многоцветного файла сделать много одноцветных, по числу цветов в палитре исходного файла - записать полученные файлы на ЖД, в том же каталоге, для последующего просмотра Вопрос: кто нибудь встречал похожие программы написанные на Дельфи? интересно взглянуть на код Заранее спасибо |
#2
|
|||
|
|||
![]() 500 руб. Ок?
|
#3
|
||||
|
||||
![]() Встречал, стандартный изврат.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#4
|
|||
|
|||
![]() а где посмотреть?
|
#5
|
||||
|
||||
![]() Справка + поиск.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#6
|
||||
|
||||
![]() Создаём новый файл с палитрой из двух цветов, копируем туда изображение. Через ScanLine или GetDIBits заменяем все не чёрные цвета на новый индекс.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#7
|
|||
|
|||
![]() Вижу, конкретно с кодом будет проблемно - видимо достаточно сложный
тогда обсудим логику работы программы вариант1 1. открыть файл БМП в каталоге 2. прочитать первый байт массива пикселей (он же последний в файле) 3. перевести в строковую форму значение индекса, записанное в байте 4. открыть новый БМП-файл, записать в него базовый файл, присвоить ему имя взятое из индекса байта пикселя (ну чтобы в имени файла было указание на палитру, не потерялось) 5. сравнить поочередно все пиксели в массиве нового файла со значением первого байта пикселя если значения равны, тогда сравниваем следующий байт пикселя если значения не равны, тогда присваиваем байту значение "черный цвет" и идем дальше сравнивать 6. сохраняем на ЖД в том же каталоге с именем к примеру 236.bmp (где 236 - строковое значение индекса байта пикселя) 7. читаем 2-й байт первого файла, зацикливаем это действие, пока не закончатся цвета в палитре итого имеем на ЖД: начальный файл файлы с именем индекса палитры 2-х цветовые, цвет фона черный, и цвет палитры Получается много много вычислений, вопросы: - можно приблизительно оценить время выполнения операции при условии что цветов в палитре скажем 150? массив размером 1280х1024 пикс, ну РС = INTEL I5 или 7? что там последнее - может еще какая логика обработки есть? |
#8
|
||||
|
||||
![]() Цитата:
![]() Слишком ты всё усложнил, задача гооораздо проще, если раньше никто не нарисует тебе код, на досуге напишу. Сейчас слегка занят. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#9
|
|||
|
|||
![]() пока с шевелением мозгов проблемы, любое движение вправо или влево привод к необходимость пару недель изучать что то новое. опыта очень мало
есть еще варианты обработки можно оптимизировать алгоритм. например не зачем проверять те точки, которые уже точно были проверены при прорисовке 1й картинки. Можно заготовить массив на 256элементов(больше вариантов в 8-бит не должно быть) и при первом проходе раскидать адреса точек, цвет которых совпадает с порядковым номером элемента. а затем рисовать эти массивы. резервируется массив из 256 8бит изображений, заполняется 0-ми. Потом сканируется исходное изображение и для каждого пиксела ставится 1 для соответствующего пиксела в изображении соответсвующем индексу. Потом для всех использовавшихся изображений создается палитра (2 цвета) и сохраняется на диск. будет ли так быстрее? и вообще правильнее? |
#10
|
||||
|
||||
![]() Не знаю, это нужно или нет:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#11
|
|||
|
|||
![]() Спасибо, там много можно изучить
есть еще такой вариант Код:
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; Код:
t.SaveToFile(IntToHex(i, 2)+'.bmp'); |
#12
|
||||
|
||||
![]() И что ты будешь делать с одноцветным битмапом?
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#13
|
|||
|
|||
![]() обрабатывать дальше - выделять символы, для начала 8-и точечным методом
|
#14
|
||||
|
||||
![]() А ну давай пытайся.
![]() Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |