| 
| 
 | Вопрос # 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. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |