|
Вопрос # 4 528/ вопрос открыт / |
|
Здравствуйте!
Пишу программу по построению схем из бисера. Такой редактор, в который можно закинуть растровую картинку, плавно подобрать масштаб и число цветов, и автоматически перевести её в бисерный вид.
Хочу начать пока с простого: взять обыкновенную gif-картинку и преобразовать ее в тот самый бисерный вид. (схема должна состоять из бусинок)
Но хотелось бы примерно знать с чего начинать практически?! Т.е. в теории это работа с массивами, думаю. Но возможно ли на Делпхи написать такую программу?
Заранее спасибо!
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
 |
Вопрос задала: Aleksandra (статус: Посетитель)
Вопрос отправлен: 23 августа 2010, 16:23
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Aleksandra!
В принципе особых проблем не вижу. Если картинку загрузили в Image или Bitmap, то с помощью свойства Pixels[col, row] можно узнать цвет текущего пикселя.
Дальше, судя с рисунка, нужна только половина пикселей. В целом, код можно написать.
Припустим, что у нас в Image1 загружена картинка (да, gif так просто не загрузишь, но bmp, jpg - без проблем.а gif потом можно добавить без проблем.)
код загрузки такой
if OpenDialog1.execute then Image1.canvas.loadFromFile(opendialog1.filename);
Саму картинку будем рисовать в Image2, который лучше положить в scrollbox
const r:integer = 10; //размер одной бисеринки.
var i, j:integer;
begin
//выставим размеры
image2.width := image1.width*r;
image2.height := image1.height*r;
image2.canvas.pen.color := clBlack; //цвет границы бусинки.
//рисуем бусинки
for i := 0 to image1.width-1 do
for j := 0 to image1.height-1 do
if odd(i + j) then begin // здесь можно писать и not odd(i + j), что бы рисовать чуточку по другому
image2.canvas.brush.color := image1.canvas.pixels[i,j];
image2.canvas.ellipse(i*r, j*r, (i+1)*r, (j+1)*r);
end;
end;
И все. но бусинки будут немного на большом растоянии друг от дружки, хотелось, что бы они были поплотнее. Нет ничего невозможного - нужно просто поправить координаты или увеличить размер бусинок. например так
image2.canvas.ellipse(i*r, j*r, (i+1)*r+k, (j+1)*r+k);
где k подбирается экспериментальным путем, до получения желаемого результат. при r = 10, рекомендую попробовать k равным 3-4. (более точная формула - k = r * корень_квадратный_2 = r * 1.4)
Можно пойди ещё дальше и по осям выбрать разные k. в таком случае бусинки будут немного приплюснутые.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 23 августа 2010, 17:10
Оценка за ответ: 5
Комментарий к оценке: Конструктивный ответ! Благодарю! :)
|
Мини-форум вопроса
Всего сообщений: 1; последнее сообщение — 23 августа 2010, 17:06; участников в обсуждении: 1.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|