Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2010, 21:52   #1
elja_1989
Пользователь
 
Регистрация: 16.03.2010
Сообщений: 58
По умолчанию Конвертирование цветов HBITMAP и компрессия данных

Имеется HBITMAP (Скриншот экрана) он 32 битный.. Как уменьшить количество цветов быстро и что бы качество картинки было относительно адекватным?

И ещё вопросик на последок, подет ли еметь смысл сжимать никий поток с помощью LZO, а потом ещё и используя ZLIB, мот кто пробовал?
elja_1989 вне форума Ответить с цитированием
Старый 15.04.2010, 21:54   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

И до какого количества цветов есть желание уменьшать? Я как-то делал что-то подобное, уменьшал до 16 цветов и сжимал RLE (не самый лучший алгоритм, зато быстрый). Качество было не ахти, но все надписи видны нормально.
Arigato вне форума Ответить с цитированием
Старый 15.04.2010, 22:02   #3
elja_1989
Пользователь
 
Регистрация: 16.03.2010
Сообщений: 58
По умолчанию Отлично

Интересует сам принцип.. но в интервале где-то от 256 до 64 цветов.. Очень бы помогло..
elja_1989 вне форума Ответить с цитированием
Старый 15.04.2010, 22:48   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Для 16-ти цветового режима я делал преобразование к палитре:
Код:
  Palette[$0] := RGBToQUAD ($00, $00, $00);
  Palette[$1] := RGBToQUAD ($80, $00, $00);
  Palette[$2] := RGBToQUAD ($00, $80, $00);
  Palette[$3] := RGBToQUAD ($80, $80, $00);
  Palette[$4] := RGBToQUAD ($00, $00, $80);
  Palette[$5] := RGBToQUAD ($80, $00, $80);
  Palette[$6] := RGBToQUAD ($00, $80, $80);
  Palette[$7] := RGBToQUAD ($80, $80, $80);
  Palette[$8] := RGBToQUAD ($C0, $C0, $C0);
  Palette[$9] := RGBToQUAD ($FF, $00, $00);
  Palette[$A] := RGBToQUAD ($00, $FF, $00);
  Palette[$B] := RGBToQUAD ($FF, $FF, $00);
  Palette[$C] := RGBToQUAD ($00, $00, $FF);
  Palette[$D] := RGBToQUAD ($FF, $00, $FF);
  Palette[$E] := RGBToQUAD ($00, $FF, $FF);
  Palette[$F] := RGBToQUAD ($FF, $FF, $FF);
Код:
  function RGBToQUAD (R, G, B: Byte): tagRGBQUAD;
  begin
    Result.rgbBlue     := B;
    Result.rgbGreen    := G;
    Result.rgbRed      := R;
    Result.rgbReserved := 0;
  end; {func RGBToQUAD}
Потом подбирался для каждого пикселя цвет наиболее близкий из палитры.
Код:
  function ColorCmp (C1, C2: tagRGBQUAD): Byte;
  var R, G, B: Byte;
  begin
    R := Abs (C1.rgbRed - C2.rgbRed);
    G := Abs (C1.rgbGreen - C2.rgbGreen);
    B := Abs (C1.rgbBlue - C2.rgbBlue);
    Result := (R + G + B) shr 2;
  end; {func ColorCmp}
  function QUADToIdx (QRGB: tagRGBQUAD): Byte;
  var Idx, Min, I: Byte;
      P: PByte;
  begin
    P := @Cache^[Cardinal(QRGB) and $FFFFFF];
    if P^ = $FF then
    begin
      Idx := 0;
      Min := ColorCmp (Palette[0], QRGB);
      for I := $1 to $F do
        if ColorCmp (Palette[I], QRGB) < Min then
        begin
          Min := ColorCmp (Palette[I], QRGB);
          Idx := I;
        end; {if}
      P^ := Idx;
    end else Idx := P^;
    Result := Idx;
  end; {func QUADToIdx}
Это в общих чертах. Для 256-ти цветового режима палитра будет больше.

P.S. Если честно, то уже плохо помню суть всех этих преобразований, тем более, что параллельно шло RLE-сжатие.

Последний раз редактировалось Arigato; 15.04.2010 в 22:52.
Arigato вне форума Ответить с цитированием
Старый 16.04.2010, 00:47   #5
elja_1989
Пользователь
 
Регистрация: 16.03.2010
Сообщений: 58
По умолчанию

пасиб и на этом, идею понял, буду эксперементировать) пожже, если не забуду выложу моё решение этой темы..
elja_1989 вне форума Ответить с цитированием
Старый 16.04.2010, 17:21   #6
elja_1989
Пользователь
 
Регистрация: 16.03.2010
Сообщений: 58
По умолчанию

CQuantizer + CXImage

помогло..
elja_1989 вне форума Ответить с цитированием
Старый 16.04.2010, 20:26   #7
elja_1989
Пользователь
 
Регистрация: 16.03.2010
Сообщений: 58
По умолчанию

А вот и не помогло) лучше со статической палитрой мутить) как Arigato сказал) так быстрее и можно управлять цветами
elja_1989 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Hbitmap из png zumm Мультимедиа в Delphi 1 27.03.2010 20:55
Компрессия коротких строк JM Han Общие вопросы C/C++ 4 24.03.2010 02:59
Drag & Drop + HBitmap BOBAH13 Win Api 6 19.07.2009 00:17
Вывод HBITMAP AidarBik Win Api 7 30.07.2008 14:21
Как из DIBSECTION востановить HBITMAP drd Win Api 1 06.03.2008 22:01