Jump to content

Recommended Posts

Posted

Double-Exposure-Text-Effect-850.jpg

 

Double exposure has been around, everywhere, for quite some time now. It's an interesting photographic technique that combines two or more exposures into a single image.

This tutorial will show you how to use some images, blend modes, and adjustment layers, to create an easy double exposure inspired text effect. Let's get started!

 

 

Step 1

Create a new 1500 x 1000 px document and fill the Background with White.

Create the text in All Caps using the font Peace Sans Regular, and use a fairly big size to show the details better.

The Size here is set to 500 pt, and the Tracking is set to 100. But you can use any other values you like with your text.

Create the Text

Step 2

Place the Branches 3 image on top of the text layer, and resize it as needed.

Add the Branches Image

2. Mask the Branches

Step 1

Command-click the text layer's thumbnail to create a selection.

Create a Selection

Step 2

Pick the Rectangular Marquee Tool, and click the Intersect with selection icon in the Options bar.

Then, click and drag to select the first letter you have, and release.

Select the First Letter

Step 3

This will deselect all the letters except for the first one.

Selected First Letter

Step 4

With the branches layer selected, click the Add layer mask icon at the bottom of the Layers panel.

Mask the Selection

Step 5

Place a new copy of the branches image, and then repeat the same steps for each of the remaining letters you have.

Each letter should have its own branches layer masked to it.

Mask the Rest of the Letters

3. Position the Branches Inside the Letters

Step 1

Make the original text layer invisible by clicking the eye icon next to it.

Make the Original Text Layer Invisible

Step 2

Click the chain icon between the layer and mask thumbnails to unlink them. This will allow you to move the image inside the mask instead of with it.

Press Command-T to enter Free Transform Mode. Move, rotate, and resize the branch inside its letter until you like how things look.

Hit Return to accept the changes.

Position the Branches Inside the Text

Step 3

Repeat that for the rest of the letters you have, and don't forget to relink the thumbnails when you're done.

Place all the branches' layers in a group and call it Text.

Repeat and Group

4. Create the Text's Gradient Map and Add the Overlay Texture

Step 1

Click the Create new fill or adjustment layer icon at the bottom of the Layers panel, and choose Gradient Map.

Add a Gradient Map Adjustment Layer

Step 2

Click the Clip to layer icon, and click the gradient fill box to create the gradient used.

To create the Gradient, you’ll need to click below the gradient bar to add Color Stops, and when you click each Color Stop, you can change its Color and Location values. Here are the Color Stop values used from left to right:

Color - Location

  • #282828 - 0%
  • #5c5353 - 25%
  • #877a7a - 50%
  • #ada3a3 - 75%
  • #f1eded - 100%
Create the Gradient Fill

Step 3

Place the New York Buildings image on top of all layers, resize it as needed, and change its layer's Blend Mode to Lighten.

Command-click the text layer's thumbnail to create a selection, and click the Add layer mask icon to mask the buildings image.

This will finish off the double exposure effect, but we'll add some more color adjustment layers to enhance the final outcome.

Add the Overlay Texture

5. Adjusting the Coloring

Step 1

Add another Gradient Map adjustment layer on top of all layers, and create the gradient using the colors #48406e to the left, #76747e in the center, and #fbc690 to the right.

Then, lower the layer's Opacity to a value around 35%.

Gradient Map

Step 2

Add a Levels adjustment layer on top of all layers, and adjust the settings of each channel as shown below:

Levels

Congratulations, You're Done!

In this tutorial, we created some text, and masked an image of branches to each of its letters separately.

Then, we positioned the branches inside each letter, and adjusted the coloring with a gradient map. After that, we added an overlay texture to create the double exposure effect. Finally, we used some more adjustment layers to adjust the coloring of the final result.

Please feel free to leave your comments, suggestions, and outcomes below.

Final result

 

Credits: Designtutsplus

  • 4 months later...
Posted

Your tutorial is great! I like them all. This is helpful, thanks, the text instruction really helps a lot. One query is that how about a tutorial on a transparent signature in which you can fill in shade colors?

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Posts

    • Verify if following is supposed to be the way to handle movement npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(point.getX(), point.getY(), point.getZ())); For me, it's not enough. And if it's the case, whole AI system is probably buggy.
    • hello, i want to wtt my charracter in l2elmorelab 1x harbor for 1.5kkk adena in l2reborn 10x new. Or if you interested tell me your offer. :)) Clean Mail 30 lvl Cleric Naked   Updated.
    • package ai.npc.NFWalker; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import l2r.gameserver.enums.CtrlIntention; import l2r.gameserver.model.Location; import l2r.gameserver.model.actor.L2Npc; import l2r.gameserver.model.quest.Quest; import l2r.gameserver.network.clientpackets.Say2; import l2r.gameserver.network.serverpackets.NpcSay; public class NFWalkerAI extends Quest { private static final int WALKER_NPC_ID = 20116; private final Map<String, Route> routes = new HashMap<>(); private final Map<Integer, Integer> npcIndexes = new HashMap<>(); private final Map<Integer, Boolean> npcReverse = new HashMap<>(); private final Map<Integer, String> npcCurrentRoute = new HashMap<>(); public NFWalkerAI() { super(-1, NFWalkerAI.class.getSimpleName(), "ai/npc/NFWalker"); loadRoutes(); addSpawnId(WALKER_NPC_ID); } private void loadRoutes() { // Route 1 Data Route route1 = new Route("route1"); route1.addPoint(new RoutePoint(0, 149363, 172341, -941, 0, false, "")); route1.addPoint(new RoutePoint(1, 148568, 172328, -980, 5, true, "Puff")); route1.addPoint(new RoutePoint(2, 148536, 172792, -980, 0, false, "")); // Route 2 Data Route route2 = new Route("route2"); route2.addPoint(new RoutePoint(0, 149363, 172341, -941, 0, false, "")); route2.addPoint(new RoutePoint(1, 150248, 172328, -980, 5, true, "Rise my children! Bring me the servants of the god! Let them be offered to our god Bifrons!")); route2.addPoint(new RoutePoint(2, 150248, 172776, -980, 0, false, "")); // Add routes to the map routes.put("route1", route1); routes.put("route2", route2); } @Override public String onSpawn(L2Npc npc) { if (npc.getId() == WALKER_NPC_ID) { selectInitialRouteForNpc(npc); } return super.onSpawn(npc); } @Override public String onAdvEvent(String event, L2Npc npc, l2r.gameserver.model.actor.instance.L2PcInstance player) { if (event.equalsIgnoreCase("move")) { moveNpc(npc); } else if (event.equalsIgnoreCase("check_reached")) { checkIfReached(npc); } return null; } private void moveNpc(L2Npc npc) { String routeName = npcCurrentRoute.get(npc.getObjectId()); Route route = routes.get(routeName); Integer pointIndex = npcIndexes.get(npc.getObjectId()); if (route != null && pointIndex != null) { RoutePoint point = route.getPoints().get(pointIndex); if (point.isRun()) { npc.setRunning(); } else { npc.setWalking(); } if (!point.getChat().isEmpty()) { npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getId(), point.getChat())); } npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(point.getX(), point.getY(), point.getZ())); // Log movement intention System.out.println("NPC " + npc.getObjectId() + " moving to " + point.getX() + ", " + point.getY() + ", " + point.getZ()); // Schedule a check to see if the NPC has reached its destination startQuestTimer("check_reached", 1000, npc, null); } } private void checkIfReached(L2Npc npc) { String routeName = npcCurrentRoute.get(npc.getObjectId()); Route route = routes.get(routeName); Integer pointIndex = npcIndexes.get(npc.getObjectId()); if (route != null && pointIndex != null) { RoutePoint point = route.getPoints().get(pointIndex); Location currentLocation = npc.getLocation(); Location targetLocation = new Location(point.getX(), point.getY(), point.getZ()); // Check if the NPC has reached the target location if (currentLocation.equals(targetLocation)) { // Log that the NPC has reached the target System.out.println("NPC " + npc.getObjectId() + " reached target " + targetLocation); // Schedule the next movement startQuestTimer("move", point.getDelay() * 1000, npc, null); if (!npcReverse.get(npc.getObjectId())) { pointIndex++; if (pointIndex >= route.getPoints().size()) { npcReverse.put(npc.getObjectId(), true); pointIndex = route.getPoints().size() - 1; } } else { pointIndex--; if (pointIndex < 0) { npcReverse.put(npc.getObjectId(), false); pointIndex = 0; // Choose a new route after completing the current one in both directions switchRouteForNpc(npc); return; } } npcIndexes.put(npc.getObjectId(), pointIndex); } else { // Check again after 1 second startQuestTimer("check_reached", 1000, npc, null); } } } private void selectInitialRouteForNpc(L2Npc npc) { // Randomly select either route1 or route2 String selectedRouteName = "route" + (new Random().nextInt(2) + 1); npcCurrentRoute.put(npc.getObjectId(), selectedRouteName); npcIndexes.put(npc.getObjectId(), 0); npcReverse.put(npc.getObjectId(), false); startQuestTimer("move", 5000, npc, null); // Log initial route selection System.out.println("NPC " + npc.getObjectId() + " selected initial route " + selectedRouteName); } private void switchRouteForNpc(L2Npc npc) { String currentRoute = npcCurrentRoute.get(npc.getObjectId()); String newRoute = currentRoute.equals("route1") ? "route2" : "route1"; npcCurrentRoute.put(npc.getObjectId(), newRoute); npcIndexes.put(npc.getObjectId(), 0); npcReverse.put(npc.getObjectId(), false); startQuestTimer("move", 5000, npc, null); // Log route switching System.out.println("NPC " + npc.getObjectId() + " switched to route " + newRoute); } private static class Route { private List<RoutePoint> points = new ArrayList<>(); public Route(String name) { } public void addPoint(RoutePoint point) { points.add(point); } public List<RoutePoint> getPoints() { return points; } } private static class RoutePoint { private int id; private int x, y, z, delay; private boolean run; private String chat; public RoutePoint(int id, int x, int y, int z, int delay, boolean run, String chat) { this.id = id; this.x = x; this.y = y; this.z = z; this.delay = delay; this.run = run; this.chat = chat; } public int getId() { return id; } public int getX() { return x; } public int getY() { return y; } public int getZ() { return z; } public int getDelay() { return delay; } public boolean isRun() { return run; } public String getChat() { return chat; } } } I looking for help, with this, the npc not start to move. Im trying to create, an NPC wich have multiple walk routes basic logic is  random pick a route complite the route  like Route 1 start form zero (0 -> 1 -> 2(or more) -> 1 -> 0) When the npc return to 0, the script should pic the other route and start again.  And if there is a message like point 1 here     "route1.addPoint(new RoutePoint(1, 148568, 172328, -980, 5, true, "Puff"));" The npc should display the chat message. Currently my problem is the npc not moving, but if I manage it to start moving its randomly move between the route 1 and 2 set of coordinates. Currently for me its  a nightmare. I hope anyone can help somhow.
    • We are certainly not an ambulance, but we will definitely cure you of blacklists and empty pockets. Live freely with SX! Each of you will receive a trial version of SX to familiarize yourself with the product, all you have to do is post in this thread
  • Topics

×
×
  • Create New...