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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 4 528

Раздел: Delphi » Прочее
/ вопрос открыт /

Здравствуйте!

Пишу программу по построению схем из бисера. Такой редактор, в который можно закинуть растровую картинку, плавно подобрать масштаб и число цветов, и автоматически перевести её в бисерный вид.
Хочу начать пока с простого: взять обыкновенную gif-картинку и преобразовать ее в тот самый бисерный вид. (схема должна состоять из бусинок)
Но хотелось бы примерно знать с чего начинать практически?! Т.е. в теории это работа с массивами, думаю. Но возможно ли на Делпхи написать такую программу?
Заранее спасибо!

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1.  


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

Вопрос задала: 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.
Ерёмин А.А.

Ерёмин А.А. (статус: *Администратор), 23 августа 2010, 17:06 [#1]:

Цитата (Aleksandra):

Делпхи

За что вы её так?

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:48
Выполнено за 0.03 сек.