как рисовать многослойные рисунки

 
0
 
.NET
ava
zenit | 16.11.2007, 22:07
У меня проблема!!!Звучит банально(надеюсь таким же банальным будет и решение, но я уже перелопатил кучу материала, но пока ни одной рабочей подсказки). Нужно в pictureBox открыть готовое изображение карты помещения, а сверху рисовать граф для навигации. Тобиш мой рисунок должен иметь прозрачный фон, чтобы были видны лиш узлы и рёбра графа. А фон(загруженная карта) был виден полноценно. Перепробовал различные подсказки, изменял фон верхнего pictureBox на transparent, ничего не работает.. Почему-то даже когда я делаю из откратой картинки BackGroundImage, всё равно моя градика перерисовывает её(даже если работать в одном pictureBox) .Подскажите, как же реализовать задуманное!!!!!!
Ответы (3)
ava
1stain | 17.11.2007, 01:11 #
с графикой не работал, так что могу предложить всего два решения, оба что называецца "в лоб".

1 - загружаешь Image1 с картой помещения, загружаешь Image2 такого же размера (или подогнать размер на ходу) c графом. Назначаешь фоновый цвет, который будет отбрасываться. Далее попиксельно смотришь рисунок 2, если GetPixel(x,y) != transparentColor, переносишь этот пиксел на рисунок1.
примерно так:

private void mergeButton_Click(object sender, EventArgs e)
{
Bitmap bmp = (Bitmap)pictureBox2.Image;
Color mask = bmp.GetPixel(1, 1);
Bitmap bmp2 = (Bitmap)pictureBox1.Image;
for( int i = 0; i < pictureBox2.Image.Width; ++i )
for (int j = 0; j < pictureBox2.Height; ++j)
{
Color c = bmp.GetPixel(i, j);
if (c != mask)
bmp2.SetPixel(i, j, c);
}
pictureBox1.Image = null;
pictureBox1.Image = bmp2;


2 - просто обрабатываешь MouseDown, MouseMove, MouseUp и рисуешь на ходу (лень писать код)



ava
zenit | 17.11.2007, 20:23 #
Цитата (1stain @ 17.11.2007, 01:11)
с графикой не работал, так что могу предложить всего два решения, оба что называецца "в лоб".




Огромезное спасибо!!!!Думаю, что я понял идею: я сравнивю каждый пиксел с исходной картинкой и перерисоваю его, копируя соответствующий пиксель из фонового рисунка. Я попытался сделать следущее: я рисую сперва линию и в цикле проверяю, изменилось ли что-нибудь. Линия должна остаться, а вот вокруг неё должен появится рисунок из фоновой картинки..Но блин, не пашет...он перерисовывает мою линию....Может, я не правильно дефенирую графический обьект?потому что он бежит в цикле и вообще не находит топго, что на рисунке что-либо изменилось...хотя чётко вижу появление линии...

pictureBox1.Image = new Bitmap(@"\Pfad\...", true);
Bitmap bmp = (Bitmap)pictureBox1.Image;
Color mask = bmp.GetPixel(1, 1);
pictureBox2.Image = new Bitmap(pictureBox2.Width, pictureBox2.Height);

Graphics g = pictureBox2.CreateGraphics();
Pen myPen = new Pen(Color.Black, 5);
Point pt1 = new Point(9, 0);
Point pt2 = new Point(50, 50);
g.DrawLine(myPen, pt1, pt2);


Bitmap bmp2 = (Bitmap)pictureBox2.Image;
Color cl = bmp2.GetPixel(1, 1);

for (int i = 0; i < pictureBox2.Width; ++i)
for (int j = 0; j < pictureBox2.Height; ++j)
{
Color c = bmp2.GetPixel(i, j);
Color c1 = bmp.GetPixel(i, j);
if (c != cl)
bmp2.SetPixel(i, j, c1);
}
//pictureBox1.Image = null;
pictureBox2.Image = bmp2;


pictureBox1 это фон
ava
1stain | 17.11.2007, 21:51 #
zenit, еще раз перечитал задание и понял, что неправильно понял задачу. То есть, ты хочешь рисовать на фоне, но сохранить в файл только нарисованное, без фона? Если да, то создай Image размером как ClientRectangle формы, загрузи рисунок для BackgroundImage формы и рисуй и на форме и на своем Image, а в файл сохраняй этот имадж.
Вобщем код прилагаеццо
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
  zenit   1stain
advanced
Отправить