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;
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;
Конвертация BMP 8bit файла в отдельные цветовые файлы
Нужна программа со следующими возможностями:
- открыть файл 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? что там последнее
- может еще какая логика обработки есть?
Преобразование bitmap-ов займёт меньше секунды (всех), запись на диск -- в зависимости от оборудования.
вот есть такой рабочий код