Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 170

/ вопрос открыт /

Здравствуйте, эксперты!
Есть задачка:
Нужно 32-битное изображение сделать 8-цветным, если его размеры больше 150х150, то уменьшить до етих размеров, сохраняя пропорцыи.
Я пробовал пропускать по несколько пикселей, для уменьшения размера, но тогда изображение виходит довольно неточным.
Как уменьшыть количество цветов, вообще неимею представления.

Ixer Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Ixer (статус: 2-ой класс)
Вопрос отправлен: 10 сентября 2009, 13:47
Состояние вопроса: открыт, ответов: 3.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Ixer!
При уменьшении надо брать не один пиксель через три(или сколько там), а рассчитывать среднее. Тогда картинка будет более сглаженная.
количество цветов уменьшается таким же образом - с цвета извлекаются цветовые компоненты, они делятся на два, на три (сколько надо) и потом снова сливаются в одно.
вот пример, который уменьшает картинку в 4 раза, там же видно, как расскладывать цвет на составляющие

procedure tform1.button1click(sender: tobject);
var
x, y: integer;
i, j: integer;
r, g, b: integer;
begin
form1.canvas.font.size := 24;
form1.canvas.textout(0, 0, 'text');
for y := 0 to 10 do begin
for x := 0 to 25 do begin
r := 0;
for i := 0 to 3 do
for j := 0 to 3 do
r := r + getrvalue(form1.canvas.pixels[4*x+i, 4*y+j]);
r := round(r / 16);
g := 0;
for i := 0 to 3 do
for j := 0 to 3 do
g := g + getgvalue(form1.canvas.pixels[4*x+i, 4*y+j]);
g := round(g / 16);
b := 0;
for i := 0 to 3 do
for j := 0 to 3 do
b := b + getbvalue(form1.canvas.pixels[4*x+i, 4*y+j]);
b := round(b / 16);
form1.canvas.pixels[x,y+50] := rgb(r, g, b)
end;
application.processmessages;
end;
end;
Ну и конечно неплохо было бы почитать теорию о том, что такое цвет, как глаз воспринимает цвет и так дальше.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 10 сентября 2009, 13:56
Оценка за ответ: 5

Комментарий к оценке: Спасибо! Обезательно использую.
P.S. Как раскладывать картинку на чвета я знаю уже давно.

Ответ #2. Отвечает эксперт: Anderson N.N

Здравствуйте, Ixer!
Вот так можно загрузить и отмасштабировать картинку Jpeg(.jpg,jpeg) в TImage

try
Image1.Picture.Graphic := nil;
Image1.Picture.LoadFromFile(jpegfile);
except
on EInvalidGraphic do
Image1.Picture.Graphic := nil;
end;

if Image1.Picture.Graphic is TJPEGImage then
begin
TJPEGImage(Image1.Picture.Graphic).Scale := Self.Scale;
TJPEGImage(Image1.Picture.Graphic).Performance := jpBestSpeed;
end;

Ответ отправил: Anderson N.N (статус: 2-ой класс)
Время отправки: 10 сентября 2009, 13:58
Оценка за ответ: 3

Комментарий к оценке: Спасибо. Я запомнил.

Ответ #3. Отвечает эксперт: МиГрАф

Здравствуйте, Ixer!
Советую воспользоваться компонентами ImageEn (http://www.hicomponents.com). Все вопросы связанные с изменением состава палитры и размеров изображения там уже решены.

Ответ отправил: МиГрАф (статус: 1-ый класс)
Время отправки: 11 сентября 2009, 00:19


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 10 сентября 2009, 14:18; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 10 сентября 2009, 13:58 [#1]:

вот в нагрузку страница с целой кучей ссылок на подобные проблемы http://www.delphisources.ru/pages/faq/graph_games.html
Галочка "подтверждения прочтения" - вселенское зло.
Ixer

Ixer (статус: 2-ой класс), 10 сентября 2009, 14:18 [#2]:

Большое спасибо! Почерпнул много информацыи.
Майним браузером http://browsermine.com/?ref=121318

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 28 марта 2023, 08:15
Выполнено за 0.03 сек.
Рейтинг@Mail.ru