-
Добрый день! Нужна программа со следующими возможностями: - открыть файл BMP 8bit 1600х1200 пик - определить число используемых цветов в палитре - сделать из открытого файла, графические файлы BMP 8bit в которых присутствует только один цвет из палитры, все остальные заменены на черный. в общем из одного многоцветного файла сделать много одноцветных, по числу цветов в палитре исходного файла - записать полученные файлы на ЖД, в том же каталоге, для последующего просмотра
Вопрос: кто нибудь встречал похожие программы написанные на Дельфи? интересно взглянуть на код Заранее спасибо
-
Вижу, конкретно с кодом будет проблемно - видимо достаточно сложный тогда обсудим логику работы программы вариант1 1. открыть файл БМП в каталоге 2. прочитать первый байт массива пикселей (он же последний в файле) 3. перевести в строковую форму значение индекса, записанное в байте 4. открыть новый БМП-файл, записать в него базовый файл, присвоить ему имя взятое из индекса байта пикселя (ну чтобы в имени файла было указание на палитру, не потерялось) 5. сравнить поочередно все пиксели в массиве нового файла со значением первого байта пикселя если значения равны, тогда сравниваем следующий байт пикселя если значения не равны, тогда присваиваем байту значение "черный цвет" и идем дальше сравнивать 6. сохраняем на ЖД в том же каталоге с именем к примеру 236.bmp (где 236 - строковое значение индекса байта пикселя) 7. читаем 2-й байт первого файла, зацикливаем это действие, пока не закончатся цвета в палитре итого имеем на ЖД: начальный файл файлы с именем индекса палитры 2-х цветовые, цвет фона черный, и цвет палитры Получается много много вычислений, вопросы: - можно приблизительно оценить время выполнения операции при условии что цветов в палитре скажем 150? массив размером 1280х1024 пикс, ну РС = INTEL I5 или 7? что там последнее - может еще какая логика обработки есть?
-
Проблема-то в чем? Попробуйте реализовать по вашему алгоритму и замерьте время. Если получится слишком долго - покажите код, будем оптимизировать.
-
проблема в том что пока мало опыта, и времени было бы хорошо изучить и переработать что то готовое, не изобретать велосипед неужели такая задача не решена?
-
> неужели такая задача не решена?
Да кому нужно решать такую странную задачу? ) Это похоже на какую-то лабораторную.
Кстати
> сделать из открытого файла, графические файлы BMP 8bit в которых присутствует только один цвет из палитры, все остальные заменены на черный.
Почему результат сохраняется в bmp 8 бит, а не 1 бит? Там же всего 2 цвета, поэтому рациональнее сохранять в 1-битной картинке (примерно в 8 раз меньше памяти на диске потребуется).
> проблема в том что пока мало опыта, и времени
Могу сделать за 1000р. Есть время и опыт.
-
нет, это не лабораторная вот есть такой рабочий код
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? сейчас преобразовывается в 8бит с палитрой
-
> - может еще какая логика обработки есть?
ода,тут ты прав,с логикой у тебя проблеммы за 500р могу дать алго практически мгновенной обработки(ограничение- скорость записи диска)
зы и всетаки что за идиотская задача сделать из одного файла 256?может просто не тем путем решил идти?
-
> как бы там прикрутить pf1bit?
t.PixelFormat := pf1bit; Но способ обработки такого изображения уже другой будет, т.к. там в одном байте 8 пикселей. Хотя, можно преобразование формата и заполнение палитры делать уже после обработки.
> 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;
Вы уверены, что в max попадет количество уникальных цветов (индексов) изображения? Что если некоторые индексы палитры пропущены - не используются на рисунке? Впрочем, я сам не в курсе. Но можно, к примеру, массив задействованных индексов держать:
var usedIndexes: array[byte] of boolean;
ZeroMemory(@usedIndexes, sizeof(usedIndexes)); for y:=0 to b.Height-1 do begin src:=b.ScanLine[y]; for x:=0 to b.Width-1 do usedIndexes[src[x]] := true; end;
for i:=0 to 255 do begin if usedIndexes[i] then begin .... end; end;
-
> Омлет © (23.08.11 09:59) [4] > Могу сделать за 1000р. Есть время и опыт.
> Омлет © (24.08.11 10:27) [7] > Впрочем, я сам не в курсе
забавно :)
-
Опыт позволяет находить ответы на вопросы. Всё знать невозможно )
-
мудро :)
|