[d | an-b-bro-fr-gf-hr-l-m-maid-med-mi-mu-ne-o-old_o-p-ph-r-s-sci-sp-t-tran-tv-w-x | bg-vg | au-mo-tr | a-aa-abe-azu-c-dn-fi-hau-jp-ls-ma-me-rm-sos-tan-to-vn | misc-tenma-vndev | dev-stat]
[Burichan] [Futaba] [Gurochan] [Tomorrow] [Архив-Каталог-RSS] [Главная]

Файл: -(378 KB, 500x500)
378 No.3925457  

Сырно, научи сохранять картинки из массива структур, описывающих цвета для каждой точки изображения (RGB палитра).

//Что я делаю?
//Для теста загружаю картинку http://i.imgur.com/tsnPula.png
Bitmap mBitmap = new Bitmap("13049902035631.bmp");
// Задаю значения для ширины и высоты, если установлю оригинальные значения, то вылезет исключение

        int width = 500;
int height = 500;

//Создаю одномерный массив байтов

        byte[] array = new byte[width * height * 3];
        int index = 0;
for (int i = 0; i < height - 1; i++)
{
for (int j = 0; j < width - 1; j++)
{

//Заполняю массив данными из исходной картинки. Метод GetPixel позволяет обратиться к каждому пикселю исходного изображения.

                array[index++] = mBitmap.GetPixel(i,j).B;
array[index++] = mBitmap.GetPixel(i, j).G;
array[index++] = mBitmap.GetPixel(i, j).R;
}
}
        Bitmap bitmap;

//Получаю управляемый указатель на массив array

        GCHandle BitsHandle = GCHandle.Alloc(array, GCHandleType.Pinned);

//Создаю новую картинку - пикрилейтед. Пикрилейтед весь перекошен как пофиксить?
bitmap = new Bitmap(width, height, width * 3, PixelFormat.Format24bppRgb, BitsHandle.AddrOfPinnedObject());

        BitsHandle.Free();

bitmap.Save("output.bmp");
>> No.3925508  
Файл: -(136 KB, 600x837)
136

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

>> No.3925516  

Может в stride дело?

>> No.3925528  

Что-то подсказывает мне, что проблема где-то здесь:

GCHandle BitsHandle = GCHandle.Alloc(array, GCHandleType.Pinned);

Но я понятия не имею где именно.

>> No.3925529  
Файл: -(3 KB, 500x500)
3

У тебя внизу две пустых строки, наверняка дело в stride. Скорми этому коду что-нибудь такое для отладки.

>> No.3925532  
>//Получаю управляемый указатель на массив array

Зачем, кстати?

>> No.3925544  

>>3925508
Но ведь у ОПа верхний уровень. Он же не парсит заголовок BMP вручную. И вообще этот BMP зло. То он сжат, то не сжат, то там палитра какаято, сверху - вниз или снизу - вверх или слева - направо.

>> No.3925545  

Мой отчим-программист говорит что-то про выровненные массивы.

>> No.3925563  
> for (int i = 0; i < height - 1; i++)
> for (int j = 0; j < width - 1; j++)

зачем тут -1?

>> No.3925565  

>>3925545
Попробуй вместо width * 3 использовать mBitmap.Stride или как он в вашем микрософтовском фреймворке называется.

>> No.3925670  
Файл: -(63 KB, 700x600)
63

>>3925544
Это не верхний же. ОП молодец, это же C++, да? Магическое знание!
О каком верхнем я говорю, так это Python, Lua, Ruby, Javascript, а код на C с указателями и алгоритмами меня вгоняет в ступор.
Такой верхний, что ты не знаешь, как написать сортировку, и используешь уже заботливо реализованный у коллекций метод sort()
Такой верхний, что ты никогда не пишешь for-циклы, а пользуешься исключительно map() или filter().

>> No.3925712  
Файл: -(409 KB, 500x500)
409

В общем пока так, stride действительно играет большое значение, но stride это свойство BitmapData, а не Bitmap, с которым я работаю. Нашел еще в интернете функцию для его получения. Вообще картинка - тестовый пример, в реальности не будет никакой входной картинки, а будет только массив структур RGB, поэтому нужно как-то самому считать этот stride.

>>3925532
Чтобы использовать его в дальнейшем для создания картинки, это скоростной способ создания картинки, другой метод был бы намного более медленным.

>>3925563
Поправил.

>>3925670
Но это C# же.

public Bitmap Create()

    {
Bitmap mBitmap = new Bitmap("13049902035631.bmp");
        int width = mBitmap.Width;
int height = mBitmap.Height;
        byte[] array = new byte[width * height * 3];
        int index = 0;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
array[index++] = mBitmap.GetPixel(i,j).B;
array[index++] = mBitmap.GetPixel(i, j).G;
array[index++] = mBitmap.GetPixel(i, i).R;
}
}
        Bitmap bitmap;
        GCHandle BitsHandle = GCHandle.Alloc(array, GCHandleType.Pinned);
bitmap = new Bitmap(width, height, GetStride(width,mBitmap.PixelFormat), PixelFormat.Format24bppRgb, BitsHandle.AddrOfPinnedObject());
        BitsHandle.Free();

bitmap.Save("output.bmp");
return bitmap;
}
    public static int GetStride(int width, PixelFormat format)
{
//int bitsPerPixel = ((int)format & 0xff00) >> 8;
int bitsPerPixel = System.Drawing.Image.GetPixelFormatSize(format);
int bytesPerPixel = (bitsPerPixel + 7) / 8;
return 4 * ((width * bytesPerPixel + 3) / 4);
}
>> No.3925716  

>>3925457
1) Как правильно отметил >>3925563, -1 тут явно лишнее. Теряешь одну строчку и один столбец.
2) BMP-файлы не так просты, как кажутся. Каждая строчка изображения должна занимать в памяти размер, кратный 4 байтам. Три (байта на пиксель) не очень кратно четырём, поэтому в некоторых случаях каждую строчку в конце приходится дополнять незначащими байтами(padding). Если не делать padding, картинка поедет. Впрочем, раз у тебя 500x500, то паддинга быть не должно.
3) Обычно BMP-файлы хранятся в памяти вверх-ногами. В общем, берёшь хотя бы https://ru.wikipedia.org/wiki/BMP и штудируешь.

Читай документацию языка на котором пишешь:
https://msdn.microsoft.com/en-us/library/zy1a2d14%28v=vs.100%29.aspx
Там даже пример есть, как правильно создавать Bitmap.

>>3925670

> это же C++, да?

Это сисярп.
Прислал оскорблённый крестовик.

>> No.3925717  
Файл: -(4 KB, 500x500)
4
>> No.3925985  
Файл: -(312 KB, 1027x768)
312

>>3925716

> Прислал оскорблённый крестовик.

Летом залезь к обидчику в квартиру и напугай как следует!

>> No.3925999  

>>3925670
Ну и зачем так жить?

>> No.3926020  
Файл: -(51 KB, 907x718)
51

>>3925670

>никогда не пишешь for-циклы

Что, даже когда они не связаны со структурами данных?

>> No.3926030  

>>3926020
Иногда можно обойтись без явно объявленных структур, если в языке есть такая штуковина, как генераторы.

>> No.3926033  

>>3926030
map(range(1,3), ...) чтобы трижды спросить юзера? Оригинально.

>> No.3926062  

>>3926033

3.times { ... }

> Оригинально

Вовсе нет.

>> No.3926066  

>>3926062

>Вовсе нет.

Зато число как объект - вполне. Хотя это тот же for.

>> No.3926070  

Вангую, все картинки на 1 апреля будут перекошенными .bmp
c: she

>> No.3926110  
Файл: -(0 KB, 40x40)
0

С пикчей из ОП поста так ничего и не получилось, однако после многих переделок отдельные пиксели рисует там где нужно.

public Bitmap Create()

    {
        int width = 40;
int height = 40;
        Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb);
BitmapData bmData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
        int stride = bmData.Stride;
        byte[] array = new byte[stride * height];
        int index = 0;
        for (int y = height-1; y >=0; y--)
{
for (int x = 0; x < width; x++)
{
                if (y == 39 & x == 39)
{
array[index++] = 1;
array[index++] = 1;
array[index++] = 110;
}
else if (y == 10 & x == 10)
{
array[index++] = 110;
array[index++] = 1;
array[index++] = 1;
}
else if (y == 11 & x == 10)
{
array[index++] = 1;
array[index++] = 110;
array[index++] = 1;
}
else
{
array[index++] = 255;
array[index++] = 255;
array[index++] = 255;
}
}
}
        System.IntPtr scan0 = bmData.Scan0;
Marshal.Copy(array, 0, scan0, stride * bitmap.Height);
bitmap.UnlockBits(bmData);
        bitmap.Save("output2.bmp");
return bitmap;
}



[d | an-b-bro-fr-gf-hr-l-m-maid-med-mi-mu-ne-o-old_o-p-ph-r-s-sci-sp-t-tran-tv-w-x | bg-vg | au-mo-tr | a-aa-abe-azu-c-dn-fi-hau-jp-ls-ma-me-rm-sos-tan-to-vn | misc-tenma-vndev | dev-stat]
[Burichan] [Futaba] [Gurochan] [Tomorrow] [Архив-Каталог-RSS] [Главная]