2014-01-17 3 views
4

Я пытаюсь создать .png изображение, которое имеет X пикселей в высоту и Y пикселей. Я не нахожу то, что ищу на dlang.org, и изо всех сил пытаюсь найти любые другие ресурсы через google.Создать новый .png Изображение в D

Можете ли вы привести пример того, как создать .png изображение в D?

Например, BufferedImage off_Image = new BufferedImage(100, 50, BufferedImage.TYPE_INT_ARGB); от http://docs.oracle.com/javase/tutorial/2d/images/drawonimage.html - это то, что я ищу (я думаю), за исключением языка программирования D.

ответ

7

Я написал небольшую библиотеку, которая тоже может это сделать. Захватите png.d и color.d отсюда:

https://github.com/adamdruppe/misc-stuff-including-D-programming-language-web-stuff

import arsd.png; 

void main() { 
    // width * height 
    TrueColorImage image = new TrueColorImage(100, 50); 

    // fill it in with a gradient 
    auto colorData = image.imageData.colors; // get a ref to the color array 
    foreach(y; 0 .. image.height) 
     foreach(x; 0 .. image.width) 
     colorData[y * image.width + x] = Color(x * 2, 0, 0); // fill in (r,g,b,a=255) 
    writePng("test.png", image); // save it to a file 
} 
5

В стандартной библиотеке для работы с изображениями нет ничего, но вы должны иметь возможность использовать DevIL или FreeImage, чтобы делать то, что вы хотите. У обоих из них есть заброшенные привязки.

Просто используйте документацию C API для любого из них.

3

Там нет стандартного 2D или 3D графики API в Фобоса, ни есть нечто похожее на API ImageIO из Java. Тем не менее, существует множество библиотек D, написанных различными людьми, а также различные привязки к библиотекам C/C++, которые могут помочь вам в том, что вы делаете. Я уверен, что вы сможете выполнить то, что вам нужно, используя некоторые части GtkD.

2

Я хотел бы предложить альтернативу решению Адама - dlib имеет довольно много модулей, которые пригождаются при написании мультимедийных приложений - манипулирование изображениями, линейная алгебра, а также обработка геометрии, потоки ввода-вывода, выполненные правильно , базовый анализ XML и другие. Он по-прежнему развивается на основных интерфейсах (по состоянию на февраль 2014 года), но в течение нескольких недель он должен стать довольно стабильным.

С dlib, что пример кода будет перевести:

import dlib.image; 

// width * height 
auto image = new Image!(PixelFormat.RGB8)(100, 50); 

// fill it in with a gradient 
foreach(y; 0 .. image.height) 
    foreach(x; 0 .. image.width) 
     image[x, y] = Color4f(x * 2/255.0f, 0, 0); 

savePNG(image, "test.png"); 

Схватив байты непосредственно, конечно, тоже возможно, но почему бы не сделать это более простой способ? Преждевременная оптимизация и т.д.

Если вы создаете приложение с dub (который вы, вероятно, должны), используя новейшие и лучшие dlib так просто, как добавление к вашему "dlib": "~master"dependencies.

Смежные вопросы