|
Вопрос # 3 170/ вопрос открыт / |
|
Здравствуйте, эксперты!
Есть задачка:
Нужно 32-битное изображение сделать 8-цветным, если его размеры больше 150х150, то уменьшить до етих размеров, сохраняя пропорцыи.
Я пробовал пропускать по несколько пикселей, для уменьшения размера, но тогда изображение виходит довольно неточным.
Как уменьшыть количество цветов, вообще неимею представления.
 |
Вопрос задал: 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.
|
Ixer (статус: 2-ой класс), 10 сентября 2009, 14:18 [#2]:
Большое спасибо! Почерпнул много информацыи.
Майним браузером http://browsermine.com/?ref=121318
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|