# फ़ाइल या नेटवर्क से छवि कैसे लोड करें

> किसी स्थानीय फ़ाइल से या नेटवर्क से डाउनलोड किया गया PNG/JPEG/GIF लोड करें और उसे ImageView के साथ प्रदर्शित करें।

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

# फ़ाइल या नेटवर्क से छवि कैसे लोड करें

**उद्देश्य।** किसी स्थानीय पथ से या नेटवर्क से डाउनलोड किए गए बाइट्स से एक छवि फ़ाइल (PNG, JPEG या GIF)
लोड करें और उसे `ImageView` के साथ स्क्रीन पर प्रदर्शित करें। फ़ोटो, आइकन और चित्र दिखाने का
यह सबसे आम तरीका है।

## उपयोग की गई APIs
- `new Image(String path) throws ImageException, IOException` — किसी फ़ाइल पथ से छवि लोड करता है। यदि फ़ाइल न मिले तो `ImageException` फेंकता है (जब पढ़ने के बाद `width == 0`)।
- `new Image(byte[] bytes) throws ImageException` — पहले से मेमोरी में मौजूद बाइट्स की एक सरणी से छवि को डिकोड करता है (PNG/JPEG/GIF)। नेटवर्क से डाउनलोड किए गए डेटा के लिए इस कंस्ट्रक्टर का उपयोग करें।
- `new ImageView(Image image, ImageSize imageSize)` — वह विजेट बनाता है जो छवि खींचता है। `ImageSize.RATIO` के साथ छवि को अनुपात बनाए रखते हुए समान रूप से स्केल किया जाता है (letter-boxing), बिना काटे।
- `ImageView.imageSize(ImageSize)` / `.alignX(Position)` / `.alignY(Position)` — आयाम मोड और संरेखण को समायोजित करने के लिए फ़्लुएंट सेटर (डिफ़ॉल्ट `Position.CENTER`)।

> Javadoc×कोड विचलन: `new Image(String)` का Javadoc कहता है "@throws ImageException When
> the file was not found", लेकिन वास्तविक हस्ताक्षर `IOException` भी घोषित करता है। दोनों को संभालें।

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

```java
package com.exemplo;

import java.io.IOException;

import dev.crossfly.Main;                    // runOnPaintThreadAndWait
import dev.crossfly.ui.*;                     // Window, Component, ImageView, UIConstants.ImageSize
import dev.crossfly.ui.layout.*;             // VerticalLayout, LAY_FILL
import dev.crossfly.ui.image.*;              // Image, ImageException

/** चलाने योग्य मुख्य स्क्रीन। launcher (classname) की ओर संकेत करें और चलाएँ: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   private ImageView imageView;

   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      // 1) एक स्थानीय फ़ाइल से
      try {
         Image img = new Image("/sdcard/foto.jpg");   // ImageException / IOException फेंक सकता है
         ImageView iv = new ImageView(img, UIConstants.ImageSize.RATIO);
         add(LAY_FILL, iv);
      } catch (ImageException | IOException e) {
         // फ़ाइल नहीं मिली या भ्रष्ट है
      }

      // 2) नेटवर्क से: paint thread के बाहर डाउनलोड और डिकोड करें, फिर विजेट अपडेट करें
      imageView = new ImageView(null, UIConstants.ImageSize.RATIO);
      add(LAY_FILL, imageView);

      new Thread(() -> {
         try {
            byte[] data = baixarBytes("https://exemplo.com/foto.png"); // आपका HTTP client
            Image img = new Image(data);              // paint thread के बाहर डिकोड करता है
            Main.runOnPaintThreadAndWait(() -> imageView.image(img));
         } catch (Exception e) {
            // नेटवर्क/डिकोडिंग त्रुटि को संभालें
         }
      }).start();
   }

   /** Stub: अपने HTTP client से बदलें। */
   private byte[] baixarBytes(String url) throws IOException
   {
      return new byte[0];
   }
}
```

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

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

```java
// स्रोत में सत्यापित: Image.java (पंक्तियाँ 403, 432) और ImageView.java (पंक्ति 72)
import dev.crossfly.ui.image.*;   // Image, ImageException
import dev.crossfly.ui.*;         // ImageView, UIConstants.ImageSize

// 1) एक स्थानीय फ़ाइल से
try {
   Image img = new Image("/sdcard/foto.jpg");   // ImageException / IOException फेंक सकता है
   ImageView iv = new ImageView(img, UIConstants.ImageSize.RATIO);
   add(iv, /* आपके container की स्थिति/लेआउट */);
} catch (ImageException | java.io.IOException e) {
   // फ़ाइल नहीं मिली या भ्रष्ट है
}
```

### नेटवर्क से (बाइट्स को paint thread के बाहर डाउनलोड करें)

`new Image(...)` पिक्सेल को डिकोड करता है और यह एक भारी ऑपरेशन है। paint thread पर **कभी** डाउनलोड या डिकोड
न करें। बाइट्स को किसी वर्कर Thread में डाउनलोड करें, वहीं `Image` बनाएँ और उसके बाद ही विजेट को अपडेट करें।

```java
// स्रोत में सत्यापित: new Image(byte[]) — Image.java पंक्ति 432
new Thread(() -> {
   try {
      byte[] data = baixarBytes("https://exemplo.com/foto.png"); // आपका HTTP client
      Image img = new Image(data);              // paint thread के बाहर डिकोड करता है
      // अब paint thread पर UI अपडेट शेड्यूल करें
      Main.runOnPaintThreadAndWait(() -> imageView.image(img));
   } catch (Exception e) {
      // नेटवर्क/डिकोडिंग त्रुटि को संभालें
   }
}).start();
```

## और गहराई से जानें
- [पृष्ठभूमि में कार्य](/docs/data-and-services/background-work) — डाउनलोड और डिकोड के लिए paint thread से कैसे बाहर निकलें।
- [ImageView विजेट](/docs/ui/widgets/imageview) और [छवियाँ](/docs/ui/images-and-graphics/images) — `ImageSize` के मोड और संरेखण।
- संबंधित रेसिपी: [imagem-de-fundo.md](/docs/cookbook/images/imagem-de-fundo)।
