본문 바로가기

Ai

flutter Dalle-3 2 달리 이미지 생성 ai 예제.

달리로 생성해본 고양이 이미지

2024 현재는 Api가 되지만 . 업데이트시 변경 될 수 있음, 주로 json 변경.

 

model 입력 란에 . dall-e-3 이라고 되어 있는데 2로 바꾸면 . 달리 2를 모델로

 

사용하게 된다 . 없으면 디폴트로 달리만 사용.

 

'model': 'dall-e-3',

 

문제는 달리3의 이미지 생성 기능은 1분에 1장이고 제한이 있고 , 걸핏 하면 안된다. json 으로 회신이 오는데 . 사용량 초과 라고 계속 나오고 답도 안줄때가 많다.

 

그래서 주로 달리 2 를 사용 한다. . 미드저니나 다른 생성 ai 보면 기대 보다 달라서

많이 아쉬울 것 같다. 기대수준을 마~~~니 낮추면 된다.

물론 , 제약 사항이 있다. 1분에 3장이다 ..

 

아래 코드는 연결하는 과정에 prompt로 사용자의 text입력을

전달 하고 받아온다.

 

     Api 키부분은 직접 발급 받아서 입력

  bool isLoading = false;
  String imageUrl = '';

  generateDalle(prompt) async {
    print('==> $prompt');
    setState(() {
      isLoading = true; // Start loading
    });
    final uri = Uri.parse('https://api.openai.com/v1/images/generations');
    final headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer ${APIKey.apiKey}'};
    final body = jsonEncode({
      'model': 'dall-e-3',
      'prompt': '$prompt',
      'size': '1024x1024',
      'quality': 'standard',
      'n': 1,
    });
 

예외처리 .

확인하느라 print 도배하는 나쁜 손 ..

try {
      final response = await http.post(uri, headers: headers, body: body);

      if (response.statusCode == 200) {
        final responseData = jsonDecode(response.body);
        final image_url = responseData['data'][0]['url'];
        print(responseData);
        print('Image URL: $image_url');

        setState(() {
          imageUrl = image_url;
          isLoading = false;
        });
      } else {
        print('Failed to generate image: ${response.body}');
        setState(() {
          isLoading = false; 
        });
      }
    } catch (er) {
      print('Error ==>> $er');
      isLoading = false;
    }
 

입력할 텍스트 필드

, dispose랑 묵어서 쓰는 편이 맘편하다.

  TextEditingController textEditingController = TextEditingController();
  @override
  void dispose() {
    textEditingController.dispose();
    super.dispose();
  }
 

화면표시와 버튼

 

generateDalle(textEditingController.text);

Scaffold(
      appBar: AppBar(title: Text('Ai Dalle 3 image')),
      body: Container(
        margin: EdgeInsets.all(20),
        child: Column(
          children: [
            TextField(
              controller: textEditingController,
              decoration: InputDecoration(
                hintText: 'hint for image',
                border: OutlineInputBorder(),
              ),
            ),
            MaterialButton(
                child: Text(isLoading ? ' Generating ...' : ' Generate Image'),
                onPressed: () {
                  if (!isLoading) {
                    generateDalle(textEditingController.text);
                  }
                }),
            imageUrl != '' ?  Image.network(imageUrl) : Container(),
            imageUrl.isNotEmpty ? Image.network(imageUrl) : Container(),
          ],
        ),
      ),
    );