There are many ways to achieve this. Take some time before making a final decision. I will briefly summarize some of the techniques you could use, and ultimately provide some code.
Hard lighting
If you want to create a strong lighting effect (for example, the image of your example) several approaches come to my mind:

Fast and dirty (as you said)
- Use black background
- Set the alpha values of the tile according to their darkness value
The problem is that you cannot make the tile brighter than before (emphasizes) and do not change the background color. Both of these aspects that usually make lighting in games look good.
The second set of tiles
- Use a second set of (black / color) tiles
- Lay them on top of the main plates.
- Set a new alpha tile depending on how strong the new color should be.
This approach has the same effect as the first, with the advantage that now you can paint overlay tiles of a different color than black, which allows you to use both colored lights and make highlights.
Example: 
Although this is easy, the problem is that it is really very inefficient. (Two processed tiles per tile, constant repainting, many rendering operations, etc.)
More effective approaches (hard and / or soft lighting)
When you look at your example, I believe that light always comes from a specific source tile (symbol, torch, etc.).
- For each type of light (large torch, small flashlight, character lighting), you create an image representing the specific behavior of the lighting relative to the original tile (light mask). Maybe something similar for a torch (white alpha):

- For each tile that is a light source, you represent this image at the source position as an overlay.
- To add a little light color, you can use for example. 10% opaque orange instead of full alpha.
results

Adding Soft Light
Soft light doesn't matter much now, just use more details in a light mask than plates. Using only 15% alpha in the usually black area, you can add a low vision effect when the tile is off:

You can easily achieve more complex forms of lighting (cones, etc.) by simply changing the image of the mask.
Multiple light sources
When combining several light sources, this approach leads to a problem: Drawing two masks that intersect with each other can cancel:

We want them to add their lights instead of subtracting them. Avoid the problem:
- Invert all light masks (alpha - dark areas, opaque - light)
- Mark all these light masks in a temporary image that has the same dimensions as the viewing area.
- Invert and render a new image (as if it were the only light mask) across the landscape.
This will lead to something like this: 
Code for mask inversion method
Assuming that you first transfer all the tiles to BufferedImage I will give a few instructions that resemble the last method shown (only grayscale support).
Several light masks, for example. torch and player can be combined as follows:
public BufferedImage combineMasks(BufferedImage[] images) { // create the new image, canvas size is the max. of all image sizes int w, h; for (BufferedImage img : images) { w = img.getWidth() > w ? img.getWidth() : w; h = img.getHeight() > h ? img.getHeight() : h; } BufferedImage combined = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); // paint all images, preserving the alpha channels Graphics g = combined.getGraphics(); for (BufferedImage img : images) g.drawImage(img, 0, 0, null); return combined; }
The final mask is created and applied using this method:
public void applyGrayscaleMaskToAlpha(BufferedImage image, BufferedImage mask) { int width = image.getWidth(); int height = image.getHeight(); int[] imagePixels = image.getRGB(0, 0, width, height, null, 0, width); int[] maskPixels = mask.getRGB(0, 0, width, height, null, 0, width); for (int i = 0; i < imagePixels.length; i++) { int color = imagePixels[i] & 0x00ffffff;
As already noted, this is a primitive example. Implementing color mixing can be a little more efficient.