Отсутствие точного результата с помощью функции DrawImage

Хорошо, у меня есть изображение, в котором хранится мой набор плиток. Затем я использую PictureBox в качестве «игрового экрана». Все, что делает код, это берет фрагмент моего набора плиток (плитку) и помещает его на игровой экран.

Вот мой код.

private void picMap_Click(object sender, EventArgs e)
        {

            //screenMain = picMap.CreateGraphics();

            // Create image.
            //gfxTiles = Image.FromFile(@Program.resourceMapFilePath + "poatiles.png");

            // Create coordinates for upper-left corner of image. 
            int x = 0;
            int y = 0;

            // Create rectangle for source image.
            Rectangle srcRect = new Rectangle(16, 16, 16, 16);
            GraphicsUnit units = GraphicsUnit.Pixel;

            // Draw image to screen.
            screenMain.DrawImage(gfxTiles, x, y, srcRect, units);
            screenMain.DrawImage(gfxTiles, 16, 0, srcRect, units);
            screenMain.DrawImage(gfxTiles, 32, 0, srcRect, units);
            screenMain.DrawImage(gfxTiles, 16, 16, srcRect, units);
        }

И вот мой результат: http://tm14.net/pokestory/mapeditor_test.png

Есть ли причина, по которой существует этот промежуток между каждой «плиткой» (это промежуток в 2 пикселя)? Я мог бы модифицировать код в гетто, но я планирую использовать алгебру, чтобы программно определять, куда должны идти плитки и т.д. , небрежный.


person Silver    schedule 18.11.2013    source источник
comment
Ty для редактирования форматирования. :) Я постараюсь быть лучше в этом в будущем.   -  person Silver    schedule 18.11.2013


Ответы (2)


Я думаю, что с вызовом DrawImage все в порядке. На опубликованном вами изображении они выглядят как плитки размером 16x16 рядом друг с другом. Я бы проверил poatiles.png. Я не уверен, что в нем находится в прямоугольнике (16, 16, 16, 16). Возможно, это не то, что вы думаете.

РЕДАКТИРОВАТЬ: я не знаю, что сказать. Я сделал png размером почти с poatiles и поместил в него квадрат 16x16, 16,16, и он нарисовал именно так, как вы ожидаете.

Код выглядит нормально, и, поскольку он работает с изображениями меньшего размера, единственное, о чем я могу думать, - это проблема с poatiles.

В MSDN есть следующий комментарий о методе Graphics.DrawImage (Image, Int32, Int32, Rectangle, GraphicsUnit)

Этот метод рисует часть изображения, используя его физический размер, поэтому часть изображения будет иметь правильный размер в дюймах независимо от разрешения (точек на дюйм) устройства отображения. Например, предположим, что часть изображения имеет ширину 216 пикселей и горизонтальное разрешение 72 точки на дюйм. Если вы вызываете этот метод для рисования этой части изображения на устройстве с разрешением 96 точек на дюйм, ширина в пикселях визуализированной части изображения будет (216/72) * 96 = 288.

Поскольку вы указываете пиксели в качестве единицы, я ожидаю, что он проигнорирует это. Но из-за отсутствия лучших идей вы можете сравнить dpi полных изображений с меньшими изображениями. (Изображение.Горизонтальное разрешение и Изображение. Вертикальное разрешение)

person Spike    schedule 18.11.2013
comment
Я мог бы выложить плитку. Но все это плитки размером 16 х 16 в листе. Вокруг этой плитки нет черного. Он просто решил, что хочет показать вокруг себя черное пространство. Это плитка целиком, просто добавляется дополнительное пространство, и я не знаю почему. - person Silver; 18.11.2013
comment
Хотел бы я отредактировать другой свой комментарий, но я не могу ... Но исходный лист плитки имеет размер 256x9616 ... Я сделал два образца изображения, которые были бы меньше, 16 x 16 (только эта одна плитка) и 64 х 32 л. Каждый из меньших листов отображает плитку так, как задумано, без промежутков или чего-либо еще. Но, похоже, проблема в самом большом листе плитки ... Я подумал, что это странное поведение. - person Silver; 18.11.2013
comment
После добавления кода для печати информации, которую вы собирались собрать, я получил следующий результат: 119.9896, 119.9896 & 95.9866, 95.9866 Первый - это вертикальные и горизонтальные плитки, которые я пытаюсь использовать. Второй - изображение меньшего размера. Означает ли это, что я должен воссоздать первый файл и посмотреть, не смогу ли я заставить его работать? Он был создан в XP для использования в проекте VB6, поэтому на самом деле он был получен из элемента управления графическим блоком VB6, который я скопировал и вставил в Paint. - person Silver; 19.11.2013
comment
Больше не могу редактировать. Ага, извини. Вместо того, чтобы строить предположения, я должен был просто попробовать ... Я воссоздал изображение (скопировал старый в новый файл) и угадаю, что: это сработало. Большое спасибо! Я бы проголосовал за, если бы мог. Ты мужчина. палец вверх - person Silver; 19.11.2013

Я не уверен, что здесь есть вся информация для начала, но вот несколько советов, которые у меня есть, глядя на то, что вы сделали до сих пор.

1) Проверьте poatiles.png, чтобы убедиться, что это определенно изображение размером 16x16 пикселей без черных пикселей вокруг него.

2) Кажется странным, что ваш Rectangle имеет четыре int в своем конструкторе. Прямоугольник обычно должен иметь только ширину и высоту (если какие-либо стороны имеют разную длину, то это не настоящий прямоугольник!)

3) Вы можете определить свои позиции на экране, умножив на ширину и высоту прямоугольника, который вы пытаетесь нарисовать, и прибавив это значение к исходной точке (0,0).

person ryanscottmurphy    schedule 18.11.2013
comment
Первые два аргумента этого конструктора Rectangle - это координаты x и y. Прямоугольник - это прямоугольная область изображения для рисования. Этот вызов DrawImage не рисует все изображение. Я предполагаю, что poatiles.png содержит несколько плиток. - person Spike; 18.11.2013