Library for image editing and text insertion

Adam Ruppe destructionator at gmail.com
Wed Apr 27 00:03:25 UTC 2022


On Tuesday, 26 April 2022 at 18:31:49 UTC, H. S. Teoh wrote:
> maybe look at Adam Ruppe's arsd library 
> (https://github.com/adamdruppe/arsd) for some lightweight 
> modules that read common image formats and do some primitive 
> image manipulations.

I don't actually have an image to image blit function, but 
writing one is trivial - just loop over it and call alphaBlend.

It can load ttf fonts, render them to bitmaps, load images, 
combined them, then save images. Can even load ttfs off the 
operating system if you wanted to use those.... or even have the 
OS functions do the drawing instead of diy, but probably easier 
to diy this simple case.

Sample code would be:

---
import arsd.image;
import arsd.ttf;

void main() {
	auto image = loadImageFromFile("/home/me/small-clouds.png");
	if(image is null)
		throw new Exception("Couldn't load the image file");
	auto tci = image.getAsTrueColorImage(); // convert to rgba for 
simplicity

	import std.file;
	auto font = TtfFont(cast(ubyte[]) 
std.file.read("/home/me/arsd/sans-serif.ttf"));

	int width, height;
	auto bitmap = font.renderString("Hello", 14, width, height); // 
it populates width and height fyi

	// where we want to put it
	int xput = 30;
	int yput = 20;

	int bitmapOffset = 0;

	// color to draw the text
	int r = 255;
	int g = 0;
	int b = 0;

	foreach(y; 0 .. height) {
		if(y + yput >= image.height)
			break;
		foreach(x; 0 .. width) {
			scope(exit) bitmapOffset++; // always advance this as long as 
we're still drawing...
			// but don't draw out of bounds
			if(x + xput >= image.width)
				continue;

			// replace a pixel with the blended version of the text bitmap
			image.setPixel(
				xput + x, yput + y,
				image.getPixel(xput + x, yput + y).
					alphaBlend(Color(r, g, b, bitmap[bitmapOffset]))
			);
		}
	}

	import arsd.png;
	writePng("text-image.png", image); // save it back to a png
}
---


Open the text-image.png to see the result. (Or:
---
     import arsd.simpledisplay;
     displayImage(Image.fromMemoryImage(image));
---
to display it in a window right from your program!)



My libs are available as individual files from the github - you 
might just use png instead of the whole image.d to avoid needing 
additional files for formats you don't need - or you can pull it 
on dub under the arsd-official:image_files package and 
arsd-official:ttf.


More information about the Digitalmars-d-learn mailing list