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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать 8 битную копию экрана в PNG? 
:(
    Опции темы
E_v_g
Дата 12.12.2012, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нужно сделать 8 битовую копию экрана в формате PNG без использования модуля Graphics. Следующий код делает 24 битную картинку. Как перевести 24 бита в 8? Пытался пользоваться GetDIBits/SetDiBits - ничего не получилось. Подскажите, пожалуйста, в какую сторону копать?

Код

uses
  Windows,
  pngimage;

var
  png1 : TPNGObject;
  R: TRect;
  DC, memDC: HDC;
  bm, oldBM: HBITMAP;
  
begin
  try
    windows.GetWindowRect(GetDesktopWindow, r);
    DC := GetDC(0);
    memDC := CreateCompatibleDC(DC);
    bm := CreateCompatibleBitmap(DC, R.Right, R.Bottom);
    oldBM := SelectObject(memDC, bm);
    BitBlt(memDC, 0,0, R.Right, R.Bottom, DC, 0,0, SRCCOPY);
    SelectObject(memDC, oldBM);
    DeleteDC(memDC);
    DeleteObject(oldBM);
    ReleaseDC(0, DC);
    png1 := TPNGObject.Create;
    png1.AssignHandle(bm, false, 0);    
    DeleteObject(bm);
    png1.CompressionLevel := 9;
    png1.SaveToFile('screen.png');
  finally
    png1.Free;
  end
end.

PM ICQ   Вверх
x128
Дата 13.12.2012, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(E_v_g @  12.12.2012,  15:44 Найти цитируемый пост)
Нужно сделать 8 битовую копию экрана в формате PNG без использования модуля Graphics.

Модуль PNGImage использует Graphics... 

Самое простое решение:
Код

var
  DC,WND: THandle;
  r: TRect;
begin
  WND:=GetDesktopWindow;
  GetWindowRect(WND, r);
  DC:=GetDC(WND);
  with TPNGObject.CreateBlank(COLOR_PALETTE,8,r.Right,r.Bottom) do begin
    BitBlt(Canvas.Handle, 0,0,Width,Height, DC, 0,0, SRCCOPY);
    CompressionLevel:=9;
    SaveToFile('screen.png');
    Free;
  end;
  ReleaseDC(WND, DC);
end;


Цитата(E_v_g @  12.12.2012,  15:44 Найти цитируемый пост)
Как перевести 24 бита в 8?

Лекция: Алгоритмы квантования для полутоновых и цветных изображений

PM MAIL WWW   Вверх
E_v_g
Дата 13.12.2012, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(x128 @  13.12.2012,  12:32 Найти цитируемый пост)
Модуль PNGImage использует Graphics... 

Если в модуле PNGImage закомментировать строку {$DEFINE UseDelphi}, то он не будет использовать модуль Graphics. Про это в справке есть и в самом модуле PNGImage написано:
Код

{$DEFINE UseDelphi}              //Disable fat vcl units(perfect for small 

поэтому Самое простое решение не поможет. Про лекцию спасибо, почитаю.
PM ICQ   Вверх
x128
Дата 14.12.2012, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(E_v_g @  13.12.2012,  16:33 Найти цитируемый пост)
Если в модуле PNGImage закомментировать строку {$DEFINE UseDelphi}, то он не будет использовать модуль Graphics.

Да, чет я тормознул...

Можно немного подправить модуль PNGImage и "Самое простое решение" останется простым =)
в классе TChunkIHDR добавляем свойство:
Код

  property ImageDCValue: HDC read ImageDC;

и потом в BitBlt вместо Canvas.Handle пишем:
Код

  BitBlt(Header.ImageDCValue, 0,0,Width,Height, DC, 0,0, SRCCOPY);


PM MAIL WWW   Вверх
E_v_g
Дата 14.12.2012, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Запрещено:

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

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

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

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


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

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


 




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


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

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