# थंबनेल (लघुचित्र) कैसे बनाएँ

> resize() के साथ किसी छवि को लघुचित्र में आकार दें, मोड और गुणवत्ता चुनते हुए।

Source: https://crossfly.dev/hi/docs/cookbook/images/thumbnail — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# थंबनेल (लघुचित्र) कैसे बनाएँ

**उद्देश्य।** केवल ड्राइंग में स्केल करने के बजाय, किसी बड़ी छवि को एक स्थायी लघुचित्र में घटाना (वास्तव में
घटाए गए पिक्सेल वाली एक **नई** `Image`)। जब आप कई लघुचित्र प्रदर्शित करते हैं तो यह टेक्सचर मेमोरी
और GPU बैंडविड्थ की बचत करता है।

## उपयोग की गई APIs
- `Image resize(int newWidth, int newHeight, ResizeMode mode, ResizeQuality quality) throws ImageException` — मुख्य प्रवेश बिंदु। एक **नई** `Image` लौटाता है; मूल छवि संशोधित नहीं होती।
- `Image resize(int newWidth, int newHeight, ResizeMode mode)` — `ResizeQuality.SMOOTH` का उपयोग करने वाला ओवरलोड।
- `Image resize(int newWidth, int newHeight)` — `ResizeMode.STRETCH` + `ResizeQuality.SMOOTH` का उपयोग करने वाला ओवरलोड।
- `Image resizeWidth(int newWidth[, ResizeQuality])` / `Image resizeHeight(int newHeight[, ResizeQuality])` — किसी लक्ष्य चौड़ाई या ऊँचाई से अनुपात बनाए रखते हुए आकार बदलते हैं (थंबनेल के लिए आदर्श)।

### Enums (`UIConstants` में सत्यापित)
`ResizeMode { STRETCH, FIT, FILL }`
- `STRETCH` — ठीक `w`×`h` को बाध्य करता है (विकृत कर सकता है)।
- `FIT` — अनुपात बनाए रखता है और **पूरी** छवि को `w`×`h` के भीतर फिट करता है (letter-box; परिणाम लक्ष्य से छोटा हो सकता है)।
- `FILL` — अनुपात बनाए रखता है और `w`×`h` को **भरता** है, केंद्र से अतिरिक्त को काटते हुए।

`ResizeQuality { FAST, SMOOTH, HARDWARE }`
- `FAST` — तेज़ नमूनाकरण (nearest); रीयल-टाइम कैश के लिए उपयोग करें।
- `SMOOTH` — उच्च गुणवत्ता वाला पुनः नमूनाकरण; सहेजे/प्रदर्शित होने वाले थंबनेल के लिए उपयोग करें।
- `HARDWARE` — स्रोत पिक्सेल बनाए रखता है और ड्राइंग के समय स्केल को GPU को सौंप देता है (pixmap मेमोरी कम नहीं करता)।

## पूर्ण उदाहरण (कॉपी करें, पेस्ट करें और चलाएँ)

```java
package com.exemplo;

import java.io.IOException;

import dev.crossfly.ui.*;                     // Window, ImageView, UIConstants.ImageSize
import dev.crossfly.ui.layout.*;             // VerticalLayout, LAY_AUTO
import dev.crossfly.ui.image.*;              // Image, ImageException
import dev.crossfly.ui.UIConstants.ResizeMode;
import dev.crossfly.ui.UIConstants.ResizeQuality;

/** चलाने योग्य मुख्य स्क्रीन। launcher (classname) की ओर संकेत करें और चलाएँ: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      try {
         Image original = new Image("/sdcard/foto.jpg");

         // 128x128 थंबनेल जो भरता है और अतिरिक्त को काटता है, अच्छी गुणवत्ता के साथ:
         Image thumb = original.resize(128, 128, ResizeMode.FILL, ResizeQuality.SMOOTH);

         // चौड़ाई से अनुपात बनाए रखने वाला विकल्प (बिना काटे):
         Image thumbW = original.resizeWidth(128, ResizeQuality.SMOOTH);

         add(new ImageView(thumb, UIConstants.ImageSize.ORIGINAL), LAY_AUTO);
         add(new ImageView(thumbW, UIConstants.ImageSize.ORIGINAL), LAY_AUTO);
      } catch (ImageException | IOException e) {
         // फ़ाइल नहीं मिली या resize में विफलता (उदा.: "Out of memory")
      }
   }
}
```

> नीचे दिया गया अंश **केवल मुख्य भाग** दिखाता है। चलाने के लिए, इसे ऊपर दिए गए `MainWindow` ढांचे में रखें।

## न्यूनतम अंश

```java
// स्रोत में सत्यापित: Image.java resize(...) पंक्ति 870; UIConstants में enums (795, 806)
import dev.crossfly.ui.image.*;   // Image, ImageException
import dev.crossfly.ui.UIConstants.ResizeMode;
import dev.crossfly.ui.UIConstants.ResizeQuality;

Image original = new Image("/sdcard/foto.jpg");

// 128x128 थंबनेल जो भरता है और अतिरिक्त को काटता है, अच्छी गुणवत्ता के साथ:
Image thumb = original.resize(128, 128, ResizeMode.FILL, ResizeQuality.SMOOTH);

// चौड़ाई से अनुपात बनाए रखने वाला विकल्प (बिना काटे):
Image thumbW = original.resizeWidth(128, ResizeQuality.SMOOTH);
```

> कार्यान्वयन नोट (स्रोत): `ResizeMode.FIT`/`FILL` के साथ, `resize` पहले समान रूप से स्केल करता है
> और `FILL` के मामले में, `getArea(...)` के माध्यम से केंद्र से काटता है। `STRETCH` के साथ यह सीधे ठीक
> स्केलिंग को कॉल करता है। `resize` `ImageException` फेंकता है (उदा.: बहुत बड़ी छवियों में "Out of memory")
> और यदि `newWidth`/`newHeight` ≤ 0 हो तो `IllegalArgumentException`।

> `resize(...)` (नए पिक्सेल बनाता है) को `renderScaleX/renderScaleY` और
> `setRenderScale(...)` के साथ भ्रमित न करें, जो केवल pixmap बदले बिना GPU के माध्यम से **ड्राइंग में** स्केल करते हैं।

## और गहराई से जानें
- [छवियाँ](/docs/ui/images-and-graphics/images) — विनाशकारी resize और render-scale के बीच अंतर।
- संबंधित रेसिपी: [salvar-imagem.md](/docs/cookbook/images/salvar-imagem) — थंबनेल बनाने के बाद उसे डिस्क पर सहेजें।
