Консультация № 66067
08.12.2006, 09:22
0.00 руб.
0 2 2
Здравствуйте, все!
Вот такая задачка:
У меня выводятся несколько картинок в StringGrid.
Нужно менять цвет для определенных областей картинки. Например: в исходной картинке область была красная - ее надо заменить на любой другой (желтый, зеленый, ... выбирать самому). Исходную картинку (файл) трогать не надо.
Я думаю, надо работать с палитрой - изменять цвет в палитре. Как в Paint-е - ту часть палитры, которая была определена, например красным, заменить на другой (изменить соотношение RGB). Тогда по идее автоматически и будут меняться цвета в картинке.
Как это сделать?
Заранее благодарен всем за ответ.
Если непонятно выразился - пишите, постораюсь уточнить.

Обсуждение

Неизвестный
08.12.2006, 17:36
общий
это ответ
Здравствуйте, Antares!
Объекты типа BitMap работают в непалитровых режимах только для 16 или 256 цветов. Если для вас это слишком мало, то можете воспользоваться попиксельной работой с картинками после загрзуки. Написать одну процедуру. Через Pixels[], конечно, не быстро но для одной обработки на загрузке пойдет.
Можно, конечно, воспользоваться TBitMap.ColorTable, но не совсем понятно, на какую именно таблицу цветов будет возвращен указатель... может быть, на системную. А ее менять не стоит и вам никто не даст. Да и формат знать надо... В MSDN про это что-то ничего не написано.
Можно еще сделать маскирование с прозрачностью по данному цвету, а фон залить другим... но это уже для настоящих, кхм, самураев =)

Приложение:
MoveColors(bmp: TBitamp; c1, c2: TColor);var i,j : integer;begin for i := 0 to bmp.width-1 do for j := 0 to bmp.height-1 do if bmp.Canvas.Pixels[i,j] = c1 then bmp.Canvas.Pixels[i,j] := c2;end;
Неизвестный
09.12.2006, 17:53
общий
это ответ
Здравствуйте, Antares!

Если я правильно понял,вы загружаете картинку в окно TStringGrin,а для изменения
области цвета хотите воспользоваться ячейками TStringGrin. Я предлагаю вам воспользоваться
методом FillRect(закрашивает поверхность канвы).Единственное,нужно будеть зафиксировать
область цвета,чтобы при очередном действии по этой же области картинки цвет не стирался.
Останется только написать массив для области окна(картинки) TStringGrin,тогда вы сможете менять цвет
любой области картинки.В приложении пример с фиксированными координатами закрашиваемой области.
Для выбора цвета применён компонент TColorDialog.
Удачи!


Приложение:
procedure TForm1.BitBtn1Click(Sender: TObject);begin if ColorDialog1.Execute then StringGrid1.Canvas.Brush.Color:=ColorDialog1.Color; StringGrid1.Canvas.FillRect(Rect(65,0, 0,24));//здесь устанавливаете // координаты углов и закрашиваемой областиend;
Форма ответа