En el desarrollo web moderno, las imágenes son fundamentales para crear experiencias visuales atractivas. Sin embargo, encontrar imágenes de calidad que sean gratuitas, consistentes y fáciles de implementar puede ser un desafío. En este artículo, te explicamos cómo utilizamos Lorem Picsum para resolver este problema de manera elegante y eficiente.
Lorem Picsum es un servicio gratuito que proporciona imágenes de placeholder de alta calidad, similar a como Lorem Ipsum proporciona texto de relleno. Es perfecto para:
javascript
// Imagen básica de 800x600
https://picsum.photos/800/600
// Imagen con seed específico (consistencia)
https://picsum.photos/seed/nature/800/600
// Imagen con efectos
https://picsum.photos/800/600?blur=2&grayscale
// Imagen aleatoria
https://picsum.photos/800/600?random=123
Una de las características más valiosas de Lorem Picsum es la capacidad de generar imágenes consistentes usando seeds. Esto es especialmente útil para:
typescript
// utils/unsplash.ts
function generateSeed(keyword: string): string {
  let hash = 0;
  for (let i = 0; i < keyword.length; i++) {
    const char = keyword.charCodeAt(i);
    hash = ((hash << 5) - hash) + char;
    hash = hash & hash; // Convert to 32-bit integer
  }
  return Math.abs(hash).toString();
}
export async function getRandomImage(keyword: string): Promise { 
  const seed = generateSeed(keyword);
  const width = 800;
  const height = 600;
  
  // Efectos opcionales para variedad
  const blur = Math.floor(Math.random() * 2);
  const grayscale = Math.random() > 0.8;
  
  let url = https://picsum.photos/seed/${seed}/${width}/${height};
  const params = [];
  
  if (blur > 0) params.push(blur=${blur});
  if (grayscale) params.push('grayscale');
  
  if (params.length > 0) {
    url += ?${params.join('&')};
  }
  
  return url;
}
javascript
// Generar imagen para artículo sobre desarrollo web
const imageUrl = await getRandomImage('web development coding');
// Resultado: https://picsum.photos/seed/1234567890/800/600
javascript
// Imágenes para diferentes categorías de productos
const techImages = await Promise.all([
  getRandomImage('technology computer'),
  getRandomImage('technology laptop'),
  getRandomImage('technology smartphone')
]);
javascript
// Imágenes para diferentes tipos de proyectos
const projectImages = {
  web: await getRandomImage('website design'),
  mobile: await getRandomImage('mobile app'),
  desktop: await getRandomImage('desktop application')
};
| Parámetro | Descripción | Ejemplo | 
|---|---|---|
blur | Aplicar desenfoque (1-10) | ?blur=3 | 
grayscale | Convertir a escala de grises | ?grayscale | 
random | Imagen aleatoria | ?random=123 | 
javascript
// Imágenes responsive con diferentes tamaños
const getResponsiveImage = (keyword, baseWidth = 800) => {
  const seed = generateSeed(keyword);
  return {
    mobile: https://picsum.photos/seed/${seed}/${baseWidth * 0.5}/400,
    tablet: https://picsum.photos/seed/${seed}/${baseWidth * 0.75}/500,
    desktop: https://picsum.photos/seed/${seed}/${baseWidth}/600
  };
};
jsx
import Image from 'next/image';
import { getRandomImage } from '@/utils/unsplash';
export default async function BlogPost({ keyword }) {
  const imageUrl = await getRandomImage(keyword);
  
  return (
    
      
        src={imageUrl}
        alt="Imagen del artículo"
        width={800}
        height={600}
        priority
      />
    
  );
}
 
jsx
import { useState, useEffect } from 'react';
import { getRandomImage } from '@/utils/unsplash';
function LazyImage({ keyword, alt }) {
  const [imageUrl, setImageUrl] = useState(null);
  
  useEffect(() => {
    getRandomImage(keyword).then(setImageUrl);
  }, [keyword]);
  
  if (!imageUrl) return 
Cargando imagen...;
  
  return 
;
}
javascript
// Implementar caché para evitar requests repetidos
const imageCache = new Map();
export async function getCachedImage(keyword) {
  if (imageCache.has(keyword)) {
    return imageCache.get(keyword);
  }
  
  const imageUrl = await getRandomImage(keyword);
  imageCache.set(keyword, imageUrl);
  return imageUrl;
}
javascript
// Implementar fallback en caso de error
async function getImageWithFallback(keyword) {
  try {
    return await getRandomImage(keyword);
  } catch (error) {
    console.warn('Error cargando imagen:', error);
    return '/images/placeholder.jpg'; // Imagen local de fallback
  }
}
javascript
// Intersection Observer para lazy loading
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.dataset.src;
      observer.unobserve(img);
    }
  });
});
| Característica | Lorem Picsum | Unsplash API | Imágenes locales | 
|---|---|---|---|
| Costo | Gratuito | Gratuito (con límites) | Gratuito | 
| Configuración | Ninguna | API key requerida | Ninguna | 
| Variedad | Alta | Muy alta | Limitada | 
| Consistencia | Excelente | Buena | Excelente | 
| Rendimiento | Excelente | Bueno | Excelente | 
| Escalabilidad | Excelente | Limitada | Limitada | 
En nuestro blog, utilizamos Lorem Picsum para generar automáticamente imágenes relevantes para cada artículo:
javascript
// Ejemplo de implementación en nuestro sistema
const blogPosts = [
  {
    title: "Optimización de JSON",
    imageKeyword: "json code formatting",
    // Genera: https://picsum.photos/seed/1234567890/800/600
  },
  {
    title: "Seguridad en WordPress",
    imageKeyword: "wordpress security password",
    // Genera: https://picsum.photos/seed/9876543210/800/600
  }
];
Lorem Picsum se ha convertido en una herramienta esencial en nuestro flujo de trabajo de desarrollo web. Su simplicidad, calidad y flexibilidad lo convierten en la solución perfecta para proyectos que necesitan imágenes de placeholder profesionales.
Te recomendamos probar Lorem Picsum en tus próximos proyectos y experimentar con sus diferentes parámetros para encontrar la configuración que mejor se adapte a tus necesidades.
Explorar nuestras herramientasSi tienes ideas para mejorar nuestro blog o quieres colaborar con un artículo, visita nuestro repositorio en GitHub o contáctanos directamente.