Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конвертация BMP 8bit файла в отдельные цветовые фа, Конвертация BMP 8bit файла 
:(
    Опции темы
Pcrepair
Дата 22.8.2011, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



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

Вопрос: кто нибудь встречал похожие программы написанные на Дельфи? интересно взглянуть на код
Заранее спасибо
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
Pcrepair
Дата 23.8.2011, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



Вижу, конкретно с кодом будет проблемно - видимо достаточно сложный
тогда обсудим логику работы программы
вариант1
1. открыть файл БМП в каталоге
2. прочитать первый байт массива пикселей (он же последний в файле)
3. перевести в строковую форму значение индекса, записанное в байте
4. открыть новый БМП-файл, записать в него базовый файл, присвоить ему имя взятое из индекса байта пикселя (ну чтобы в имени файла было указание на палитру, не потерялось)
5. сравнить поочередно все пиксели в массиве нового файла со значением первого байта пикселя
если значения равны, тогда сравниваем следующий байт пикселя
если значения не равны, тогда присваиваем байту значение "черный цвет" и идем дальше сравнивать
6. сохраняем на ЖД в том же каталоге с именем к примеру 236.bmp (где 236 - строковое значение индекса байта пикселя)
7. читаем 2-й байт первого файла, зацикливаем это действие, пока не закончатся цвета в палитре
итого имеем на ЖД:
начальный файл
файлы с именем индекса палитры 2-х цветовые, цвет фона черный, и цвет палитры
Получается много много вычислений, вопросы:
- можно приблизительно оценить время выполнения операции при условии что цветов в палитре скажем 150? массив размером 1280х1024 пикс,  ну РС = INTEL I5 или 7? что там последнее
- может еще какая логика обработки есть? 
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
Чучмек
Дата 23.8.2011, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 2
Всего: 41



Цитата(Pcrepair @  23.8.2011,  07:45 Найти цитируемый пост)
Вижу, конкретно с кодом будет проблемно - видимо достаточно сложный

 smile 
Код

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


type
 p_LOGPALETTE_1bit=^T_LOGPALETTE_1bit;
 T_LOGPALETTE_1bit  = packed record
    palVersion: Word;
    palNumEntries: Word;
    palPalEntry: array[0..1] of cardinal;
    end;


procedure TForm1.Button1Click(Sender: TObject);
var
 LogPalette:p_LOGPALETTE_1bit;
 bmp:tbitmap;                     //Битмап исходной картинки
 mbmp:array[0..255] of tbitmap;   //Массив битмапов на каждый цвет палитры
 mline:array[0..255]of pointer;   //Массив указателей на текущую стоку каждого битмапа из mbmp
 mColorPalette:array[0..255]of cardinal;  //Массив цветов палитры
 mIsColor:array[0..255]of byte;   //
 ColorCont:byte;                  //Сколько цветов из палитры используется в bmp
 ColorIndex:byte;                 //
  i,j,n:integer;
  p:pointer;
  d:word;
  mask:byte;
  pb:pbyte;

Im: TImage;
begin
if not OpenDialog1.Execute then exit;
bmp:=tbitmap.Create;
bmp.LoadFromFile(OpenDialog1.FileName);   //Картинку в Битмап
image1.Picture.Bitmap.FreeImage;
image1.Picture.Bitmap:=bmp;

if bmp.PixelFormat<> pf8bit then exit;    //Если не 8bit - выход

GetPaletteEntries(bmp.Palette,0,256,mColorPalette);  //Получаем цвета палитры
for i:=0 to 255 do                            //Под каждый цвет палитры создаем  битмап
 begin
 new(LogPalette);                            //Палитра нового битмапа
 LogPalette^.palVersion:=$300;
 LogPalette^.palNumEntries:=2;               //Всего два цвета - черный и цвет из палитры bmp
 if mColorPalette[i] and $00FFFFFF =0  then       //Черный цвет на белом фоне
     LogPalette^.palPalEntry[0]:=$00FFFFFF else
     LogPalette^.palPalEntry[0]:=0;
 LogPalette^.palPalEntry[1]:=mColorPalette[i];

 mbmp[i]:=TBitMap.Create;
 mbmp[i].Monochrome:=false;
 mbmp[i].PixelFormat:=pf1bit;
 mbmp[i].Width:=bmp.Width;
 mbmp[i].Height:=bmp.Height;
 mbmp[i].Palette:=CreatePalette(PLogPalette(LogPalette)^);
 end;


ColorCont:=0;
for i:=0 to bmp.Height-1 do    //Перебираем строки битмапа
 begin
 p:=bmp.ScanLine[i];          //Строка исходного битмапа
 for j:=0 to 255 do
   begin
   mline[j]:=mbmp[j].ScanLine[i];     //Получаем стоки всех битмапов из mbmp
   fillchar(mline[j]^,trunc(bmp.Width/8),0);    //Черный цвет во всю строку
   end;
 d:=0;        //Нулевое смешение
 mask:=$80;   //Маска - 10000000
 for j:=0 to bmp.Width-1 do    //Перебираем все пиксели в строке
    begin
    ColorIndex:=pbyte(cardinal(p)+j)^;  //Цвет пикселя онже индекс битмапа в mbmp
    n:=0;
    while n<ColorCont do               //Если цвета нет в  mIsColor то надо его туда добавить
     begin
     if mIsColor[n]=ColorIndex then break;
     inc(n);
     end;
    if n=ColorCont then
         begin
         mIsColor[ColorCont]:=ColorIndex;
         inc(ColorCont);
         end;

  pb:=pbyte(cardinal(mline[ColorIndex])+d);  //Указатель байт(цвета 8 пикселей) в строке битмапа(из mbmp),соответсвуещего ColorIndex
  pb^:=pb^ or mask;     //Бит цвета в 1
  mask:= mask shr 1;    //Будем сохранять следуюший  бит/пиксель
    if mask = 0 then    //Если обработали все биты   pb^, переходим к следующему байту строки
       begin
       mask:=$80;
       inc(d);
       end;
    end;
 end;

for i:=0 to ColorCont-1 do
 begin
 Im:=TImage.Create(nil);
 Im.AutoSize:=true;
 im.Picture.Bitmap:=mbmp[mIsColor[i]];
 im.Left:=50+im.Width;
 im.Top:=i*im.Height+i;
 form1.InsertControl(im);
{Вместо всего этого -  mbmp[mIsColor[i]].SaveToFile('FileName'+inttostr(i)); }
 end;


end;

end.



Цитата(Pcrepair @  23.8.2011,  07:45 Найти цитируемый пост)
тогда обсудим логику работы программы
вариант1

Все гораздо проще



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Pcrepair
Дата 23.8.2011, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



Спасибо за помощь, в конце пришлось немного доработать
Код

for i:=0 to ColorCont-1 do
 begin
 Im:=TImage.Create(nil);
 Im.AutoSize:=true;
 im.Picture.Bitmap:=mbmp[mIsColor[i]];
 im.Left:=50+im.Width;
 im.Top:=i*im.Height+i;
 form1.InsertControl(im);
 mbmp[mIsColor[i]].SaveToFile(IntToHex(i, 2)+'.bmp');
 end;
end;

иначе только картинка отображалась на ТИмедж1 а самой конвертации не было , и мне больше нравится отображение имени файла в 16-и ричном формате. время преобразования менее сек с учетом записи на ЖД

все таки часть картинок почему то черно-цветная (зеленая, красная...)
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
Чучмек
Дата 23.8.2011, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 2
Всего: 41



Цитата(Pcrepair @  23.8.2011,  20:24 Найти цитируемый пост)
черно-цветная (

Кроме черного на картинке более одного цвета?
Интересно... В двухцветной палитре три цвета smile 
Дай исходный bmp



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Pcrepair
Дата 24.8.2011, 07:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



исходный БМП тут: http://wirelessinternetkrd.narod.ru/test.bmp
на форум не влезло 1.3 мб
другие варианты то же кстати так же работают
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
Чучмек
Дата 24.8.2011, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 2
Всего: 41



Ну и какой кадр там цветной получается?


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Pcrepair
Дата 25.8.2011, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



в том числе вот этот
http://wirelessinternetkrd.narod.ru/8C.bmp
чета в форум не грузится
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
Чучмек
Дата 25.8.2011, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 2
Всего: 41



Ну.
Зеленая составляющая на черном фоне.
Тебе что надо? 
Черно-белый? 


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Pcrepair
Дата 25.8.2011, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



Да
белый - вместо зеленого, ли любого другого из палитры
черный - фон
информация о цвете сохраняется в имени файла и в палитре оставшегося BMP 8bit

вот что мне непонятно, ведь палитры в 1Бит файле нет? где информация о цвете сохраняется?
далее, функция pf1bit то же такой файл делает (если взять BMP 8bit и пропустить через pf1bit)
 и еще вопрос:
есть HEX-редакторы, там вывод побайтно
а нет редакторов с выводом побитно, ну просто для наглядности

--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
Чучмек
Дата 26.8.2011, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 2
Всего: 41



Цитата(Pcrepair @  25.8.2011,  19:22 Найти цитируемый пост)
ведь палитры в 1Бит файле нет? 

Почему нет? Двухцветная палитра.
Если 1 - цвет палитры с номером 1, если 0 - с номером 0. 
Цитата(Чучмек @  23.8.2011,  17:17 Найти цитируемый пост)
LogPalette^.palVersion:=$300;
 LogPalette^.palNumEntries:=2;               //Всего два цвета - черный и цвет из палитры bmp
 if mColorPalette[i] and $00FFFFFF =0  then       //Черный цвет на белом фоне
     LogPalette^.palPalEntry[0]:=$00FFFFFF else
     LogPalette^.palPalEntry[0]:=0;
 LogPalette^.palPalEntry[1]:=mColorPalette[i];

Вот мы ее и описываем.
Если надо черно-белый 
вместо LogPalette^.palPalEntry[1]:=mColorPalette[i]
пиши  LogPalette^.palPalEntry[1]:=$00FFFFFF; (толлько тогда без   if , иначе для черного получишь белое на белом)  
Или создавай монохромный битмап.


Цитата(Pcrepair @  25.8.2011,  19:22 Найти цитируемый пост)
информация о цвете сохраняется в имени файла и в палитре оставшегося BMP 8bit

Не 
Цитата(Pcrepair @  23.8.2011,  20:24 Найти цитируемый пост)
IntToHex(i, 2)
 , а IntToHex(mIsColor[i], 2).
i это только индекс массива используемых цветов (нужен, чтобы не создавать пустых(черных) файлов)
Но правильно информацию о цвете выводить как IntToHex(mColorPalette[mIsColor[i]],6) - сам цвет, а не номер в палитре.


Цитата(Pcrepair @  25.8.2011,  19:22 Найти цитируемый пост)
с выводом побитно

$F - 1111b
$E - 1110b
$D - 1101b
ит.д.
$EF - 11101111
Чего нет - сделай сам. Затем Delphi и нужен(нужна,нужно...).





--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.