Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Повернутое изображение  [new]
ferzmikk
Member

Откуда:
Сообщений: 2213
Здравствуйте!

Есть изображение размерами 6 на 6. Нужно выгрузить это изображение и получить массив изображения. Полученный массив сохранить в JSON.

К сообщению приложен файл. Размер - 1Kb
17 фев 21, 14:43    [22282305]     Ответить | Цитировать Сообщить модератору
 Re: Повернутое изображение  [new]
ferzmikk
Member

Откуда:
Сообщений: 2213
Написал такой код
+class DataColor
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;

namespace Test
{
    [DataContract]
    class DataColor
    {
        [DataMember]
        public List<List<DataColors>> Colors { get; set; }
        [DataMember]
        public Int32 Marker { get; set; }

        public DataColor(Int32 width, Int32 height)
        {
            this.Colors = new List<List<DataColors>>();

            for (int i = 0; i < width; i++)
            {
                var dim = new List<DataColors>();

                for (int j = 0; j < height; j++)
                {
                    var data = new DataColors();

                    dim.Add(data);
                }

                this.Colors.Add(dim);
            }
        }

        [DataContract]
        public class DataColors
        {
            [DataMember]
            public Int32 ColorR { get; set; }
            [DataMember]
            public Int32 ColorG { get; set; }
            [DataMember]
            public Int32 ColorB { get; set; }            
        }        
    }
}
+class Program
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Drawing;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            List<DataColor> ListdataColor = new List<DataColor>();

            DataColor CurrentData = new DataColor(6, 6);
                        
            Bitmap bmp = new Bitmap(Image.FromFile("C:\\Users\\Acer\\Desktop\\MarkerTest.png"));
            Color pixelColor;

            for (int i = 0; i < 6; i++)
            {
                for (int j = 0; j < 6; j++)
                {
                    pixelColor = bmp.GetPixel(i, j);

                    CurrentData.Colors[i][j].ColorR = pixelColor.R;
                    CurrentData.Colors[i][j].ColorG = pixelColor.G;
                    CurrentData.Colors[i][j].ColorB = pixelColor.B;
                }
            }

            ListdataColor.Add(CurrentData);

            string pathjson = "C:\\Users\\Acer\\Desktop\\MarkerTest.json";

            var jsonFormatter = new DataContractJsonSerializer(typeof(List<DataColor>));            

            using (var file = new FileStream(pathjson, FileMode.OpenOrCreate))
            {
                jsonFormatter.WriteObject(file, ListdataColor);
            }

            Console.ReadKey();
        }
    }
}
17 фев 21, 14:45    [22282306]     Ответить | Цитировать Сообщить модератору
 Re: Повернутое изображение  [new]
ferzmikk
Member

Откуда:
Сообщений: 2213
Когда открываешь на питоне, то изображение почему то повернутое на 90 градусов против часовой стрелки. См. скриншот.

К сообщению приложен файл. Размер - 28Kb
17 фев 21, 14:46    [22282307]     Ответить | Цитировать Сообщить модератору
 Re: Повернутое изображение  [new]
ferzmikk
Member

Откуда:
Сообщений: 2213
Учитывая, что в BitMap система координат начинается слева вверху. Но на скриншоте повернута на 90 градусов.

Похоже не правильно использую GetPixel.

Скажите, как правильно написать код?
17 фев 21, 14:47    [22282308]     Ответить | Цитировать Сообщить модератору
 Re: Повернутое изображение  [new]
ferzmikk
Member

Откуда:
Сообщений: 2213
Надо было поменять местами i и j
            for (int i = 0; i < 6; i++)
            {
                for (int j = 0; j < 6; j++)
                {
                    pixelColor = bmp.GetPixel(j, i);

                    CurrentData.Colors[i][j].ColorR = pixelColor.R;
                    CurrentData.Colors[i][j].ColorG = pixelColor.G;
                    CurrentData.Colors[i][j].ColorB = pixelColor.B;
                }
            }
17 фев 21, 20:05    [22282478]     Ответить | Цитировать Сообщить модератору
 Re: Повернутое изображение  [new]
ferzmikk
Member

Откуда:
Сообщений: 2213
ferzmikk
Надо было поменять местами i и j

В общем, по экспериментировал и обнаружил интересную вещь, что есть разница, если использовать GetPixel для PictureBox и для JSON.

На форме имеется PictureBox и Button.
+class Form1
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Windows.Forms;
using System.Drawing.Imaging;

namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }        

        private void button1_Click(object sender, EventArgs e)
        {
            Bitmap OriginBitmap;
            List<DataColor> ListdataColor = new List<DataColor>();
            DataColor CurrentData = new DataColor(6, 6);

            //Получаем изображение 6 на 6
            Image image = Image.FromFile("C:\\Users\\Acer\\Desktop\\MarkerTest.png");

            OriginBitmap = new Bitmap(image);            

            //Квадрат, который вырезается из OriginBitmap (в данном случае вырезаем целиком)
            Rectangle cloneRect = new Rectangle(0, 0, 6, 6);

            //Получаем вырезанное изображение
            PixelFormat format = OriginBitmap.PixelFormat;
            Bitmap cloneBitmap = OriginBitmap.Clone(cloneRect, format);

            Color pixelColorForForm, pixelColorForJSON;
            SolidBrush pixelBrush;

            //Создаем увеличенное изображение, чтобы каждый пиксель был виден
            Bitmap newBitmap = new Bitmap(6 * 10, 6 * 10);
            using (Graphics g = Graphics.FromImage(newBitmap))
            {
                CurrentData = new DataColor(6, 6);

                for (int i = 0; i < 6; i++)
                {
                    for (int j = 0; j < 6; j++)
                    {
                        pixelColorForForm = cloneBitmap.GetPixel(i, j);
                        pixelColorForJSON = cloneBitmap.GetPixel(j, i);

                        pixelBrush = new SolidBrush(pixelColorForForm);

                        g.FillRectangle(pixelBrush, i * 10, j * 10, 10, 10);

                        CurrentData.Colors[i][j].ColorR = pixelColorForJSON.R;
                        CurrentData.Colors[i][j].ColorG = pixelColorForJSON.G;
                        CurrentData.Colors[i][j].ColorB = pixelColorForJSON.B;
                    }
                }                

                g.Dispose();
            }

            pictureBox1.Image = newBitmap;

            //Для JSON
            ListdataColor.Add(CurrentData);

            string pathjson = "C:\\Users\\Acer\\Desktop\\MarkerTest.json";

            var jsonFormatter = new DataContractJsonSerializer(typeof(List<DataColor>));

            using (var file = new FileStream(pathjson, FileMode.OpenOrCreate))
            {
                jsonFormatter.WriteObject(file, ListdataColor);
            }

        }
    }
}
17 фев 21, 23:14    [22282529]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить