Конференция "Media" » Конвертация BMP 8bit файла в отдельные цветовые файлы
 
  • Pcrepair © (22.08.11 16:16) [0]
    Добрый день!
    Нужна программа со следующими возможностями:
    - открыть файл BMP 8bit 1600х1200 пик
    - определить число используемых цветов в палитре
    - сделать из открытого файла, графические файлы BMP 8bit в которых присутствует только один цвет из палитры, все остальные заменены на черный. в общем из одного многоцветного файла сделать много одноцветных, по числу цветов в палитре исходного файла
    - записать полученные файлы на ЖД, в том же каталоге, для последующего просмотра

    Вопрос: кто нибудь встречал похожие программы написанные на Дельфи? интересно взглянуть на код
    Заранее спасибо
  • Pcrepair © (22.08.11 23:40) [1]
    Вижу, конкретно с кодом будет проблемно - видимо достаточно сложный
    тогда обсудим логику работы программы
    вариант1
    1. открыть файл БМП в каталоге
    2. прочитать первый байт массива пикселей (он же последний в файле)
    3. перевести в строковую форму значение индекса, записанное в байте
    4. открыть новый БМП-файл, записать в него базовый файл, присвоить ему имя взятое из индекса байта пикселя (ну чтобы в имени файла было указание на палитру, не потерялось)
    5. сравнить поочередно все пиксели в массиве нового файла со значением первого байта пикселя
    если значения равны, тогда сравниваем следующий байт пикселя
    если значения не равны, тогда присваиваем байту значение "черный цвет" и идем дальше сравнивать
    6. сохраняем на ЖД в том же каталоге с именем к примеру 236.bmp (где 236 - строковое значение индекса байта пикселя)
    7. читаем 2-й байт первого файла, зацикливаем это действие, пока не закончатся цвета в палитре
    итого имеем на ЖД:
    начальный файл
    файлы с именем индекса палитры 2-х цветовые, цвет фона черный, и цвет палитры
    Получается много много вычислений, вопросы:
    - можно приблизительно оценить время выполнения операции при условии что цветов в палитре скажем 150? массив размером 1280х1024 пикс,  ну РС = INTEL I5 или 7? что там последнее
    - может еще какая логика обработки есть?
  • Омлет © (23.08.11 07:29) [2]
    Проблема-то в чем? Попробуйте реализовать по вашему алгоритму и замерьте время.
    Если получится слишком долго - покажите код, будем оптимизировать.
  • Pcrepair © (23.08.11 08:43) [3]
    проблема в том что пока мало опыта, и времени
    было бы хорошо изучить и переработать что то готовое, не изобретать велосипед
    неужели такая задача не решена?
  • Омлет © (23.08.11 09:59) [4]
    > неужели такая задача не решена?

    Да кому нужно решать такую странную задачу? )
    Это похоже на какую-то лабораторную.

    Кстати

    > сделать из открытого файла, графические файлы BMP 8bit в которых присутствует только один цвет из палитры, все остальные заменены на черный.

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

    > проблема в том что пока мало опыта, и времени

    Могу сделать за 1000р. Есть время и опыт.
  • Pcrepair © (23.08.11 22:14) [5]
    нет, это не лабораторная
    вот есть такой рабочий код

    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бит с палитрой
  • QAZ (24.08.11 10:03) [6]

    > - может еще какая логика обработки есть?

    ода,тут ты прав,с логикой у тебя проблеммы
    за 500р могу дать алго практически мгновенной обработки(ограничение- скорость записи диска)

    зы
    и всетаки что за идиотская задача сделать из одного файла 256?может просто не тем путем решил идти?
  • Омлет © (24.08.11 10:27) [7]
    > как бы там прикрутить 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;
  • QAZ (24.08.11 10:54) [8]

    > Омлет ©   (23.08.11 09:59) [4]
    > Могу сделать за 1000р. Есть время и опыт.


    > Омлет ©   (24.08.11 10:27) [7]
    > Впрочем, я сам не в курсе

    забавно :)
  • Омлет © (24.08.11 11:18) [9]
    Опыт позволяет находить ответы на вопросы. Всё знать невозможно )
  • QAZ (24.08.11 11:23) [10]
    мудро :)
 
Конференция "Media" » Конвертация BMP 8bit файла в отдельные цветовые файлы
Есть новые Нет новых   [120078   +30][b:0][p:0.001]