Polskie Forum Użytkowników GIMP-a

Ogólne dyskusje => GIMP - pomoc => Wątek zaczęty przez: Gimpo-cienias on 22.01.2022, 01:42:02



Tytuł: Generowanie dużej ilości plików PNG z pliku TXT
Wiadomość wysłana przez: Gimpo-cienias on 22.01.2022, 01:42:02
Witajcie.
Potrzebuję zrobić projekt polegający na stworzeniu według szablonu kilkuset obrazków lub więcej. Wydaje się, że GIMP jest odpowiedni, ale jakbym robił jedną sztukę, albo kilka to nie byłoby tematu. Mam plik tekstowy a w nim dwie kolumny z tekstem rozdzielanym przecinkami:
1, jeden
2, dwa
3, trzy
… itd.
Potrzebuję utworzyć plik png o rozmiarach z jakiegoś szablonu, np. 1000x1200. Właśnie, czy użyć szablonu, czy wcześniej zrobić pusty plik PNG i go otwierać? Czy można zrobić skrypt, który pobierze pierwszą linię pliku txt, pierwszą zmienną użyje na później do nadania nazw plikom, a drugą zmienną wklei do pola tekstowego?

Pole tekstowe trzeba rozszerzyć od lewego do prawego brzegu, zwiększyć czcionkę, aby wypełniała to okienko maksymalnie. Tutaj zmiana koloru czcionki i tła. Z tym bym sobie poradził. Pytanie tylko, bo zmienna miałaby różną długość znaków, więc czy wielkość liter można byłoby ustawić tak jak np. w Excelu, żeby dopasował do szerokości komórki? Aby mieć pewność, że wszystko się zmieści w jednej linii a jednocześnie było od brzegu do brzegu.

No i na koniec skrypt miałby zapisać projekt w formacie gimp oraz wyeksportować do PNG, do nadania nazw plikom używając pierwszej zmiennej z pliku tekstowego.

No i jak to zrobi, to w następnej iteracji miałby zrobić to samo dla kolejnych danych z pliku tekstowego.

Nie wiem czy da się to zrobić skryptem w GIMP ani jak to zrobić. Widziałem różne skrypty do GIMP, ale one tylko robią coś z obrazem. Z VBA wiedziałbym co zrobić w Excelu, a tutaj nie wiem, czy iść tym tropem, czy sobie odpuścić Gimp. Może jest coś prostszego do tego celu? Najlepiej jakby można było rejestrować makro jak w MS Excelu, bo wtedy nie trzeba być mega programistą, aby taki skrypt posklejać.

No i czy mam zainteresować się konsolą Script-Fu, Pyton-Fu, czy raczej tworzyć pliki *.py lub *scm? Działam na Win7 lub Win10, oba 64bit.


Tytuł: Odp: Generowanie dużej ilości plików PNG z pliku TXT
Wiadomość wysłana przez: Ziomioslaw on 22.01.2022, 08:44:56
Cytuj
Pole tekstowe trzeba rozszerzyć od lewego do prawego brzegu, zwiększyć czcionkę, aby wypełniała to okienko maksymalnie. Tutaj zmiana koloru czcionki i tła. Z tym bym sobie poradził. Pytanie tylko, bo zmienna miałaby różną długość znaków, więc czy wielkość liter można byłoby ustawić tak jak np. w Excelu, żeby dopasował do szerokości komórki? Aby mieć pewność, że wszystko się zmieści w jednej linii a jednocześnie było od brzegu do brzegu.

Najprościej zacząć od przygotowania jednego skryptu, który weźmie ten Twój obrazek i zrobi napis jaki będziesz chciał. Bo można oczywiście zwiększać czcionkę, ale to też powoduje powiększanie się tekstu w pionie.
Oprócz zmiany wielkości czcionki, można w GIMP-ie zwiększyć odstępy między poszczególnymi literami, może to Ci podpasuje? Popróbuj (bezpośrednio w GIMP-ie).
No i sam tekst, można traktować jak obrazek, czyli np.: go skalować.

Cytuj
No i czy mam zainteresować się konsolą Script-Fu, Pyton-Fu, czy raczej tworzyć pliki *.py lub *scm? Działam na Win7 lub Win10, oba 64bit.

Raczej interesują Cię pliki.


Tytuł: Odp: Generowanie dużej ilości plików PNG z pliku TXT
Wiadomość wysłana przez: be@ on 22.01.2022, 12:54:26
Nigdy nie słyszałam o skrypcie do GIMP-a, który pobiera dane z pliku tekstowego i wstawia do kolejnych obrazów/warstw. Rozumiem, że chodzi o coś takiego jak np. tworzenie winietek, gdzie po kolei trzeba wpisać różne nazwiska do kilkudziesięciu takich samych obrazków. Wiem, że taka opcja jest w AI (https://grafmag.pl/artykuly/generujemy-swiateczne-kartki-z-wykorzystaniem-zmiennych-illustratora (https://grafmag.pl/artykuly/generujemy-swiateczne-kartki-z-wykorzystaniem-zmiennych-illustratora) lub https://youtu.be/xA3cznd14-c (https://youtu.be/xA3cznd14-c)) i zapewne też PS, ale obawiam się, że GIMP sobie z czymś takim nie radzi. No ale może się mylę i ktoś tu poda na to sposób...
Jeśli chodzi o wypełnienie tekstem całej szerokości obrazu/pola tekstowego, to z tego co przetestowałam, Justowanie: Wypełnione nie działa prawidłowo w GIMP, gdy mamy tylko jedną linijkę tekstu :(

https://www.gimpuj.info/index.php/topic,68518.0.html - tu jest podobny wątek, tylko nieco mniejsze wymagania


Tytuł: Odp: Generowanie dużej ilości plików PNG z pliku TXT
Wiadomość wysłana przez: Ziomioslaw on 22.01.2022, 14:29:01
Już Ci odpowiedziałem na shoucie, że jest to możliwe, albo osiągalne także w GIMP-ie.


Tytuł: Odp: Generowanie dużej ilości plików PNG z pliku TXT
Wiadomość wysłana przez: be@ on 22.01.2022, 14:38:42
Już Ci odpowiedziałem na shoucie, że jest to możliwe...
A to nie mnie masz odpowiadać, tylko autorowi wątku :P Jeśli możliwe, to udowodnij ;)

@Gimpo-cienias (https://www.gimpuj.info/index.php?action=profile;u=91318) - a nie może być ten tekst po prostu wyśrodkowany? Musi być na całą szerokość grafiki? Jeśli w części plików będą większe litery, to może dziwnie wyglądać. W przypadku dużej różnicy w długości tekstów również samo justowanie w trybie wypełnienia może dać nieciekawy efekt nadmiernie rozstrzelonych liter. Lepiej już, żeby tekst był wyśrodkowany i w dwóch wierszach, kiedy jest dłuższy


Tytuł: Odp: Generowanie dużej ilości plików PNG z pliku TXT
Wiadomość wysłana przez: Gimpo-cienias on 22.01.2022, 15:57:54
Biorę pod uwagę takie rozwiązanie, aby tylko wyjustować. W excellu użyłbym funkcji liczącej ilość znaków, posortował i podzielił sobie zadanie w ten sposób, że tam gdzie tekst nie mieściłby się, użyłbym mniejszej czcionki.


Tytuł: Odp: Generowanie dużej ilości plików PNG z pliku TXT
Wiadomość wysłana przez: Gimpo-cienias on 22.01.2022, 22:28:12
Całą sobotę nad tym siedziałem i mętlik większy w głowie mam.
https://boardgamegeek.com/thread/1925214/laying-out-cards-quickly-gimp-and-bit-programming
Ten wątek jest ciekawy, teraz jakby go uprościć do dwóch zmiennych, a w zasadzie do jednej warstwy. Ktoś porządnie nakombinował z tym wszystkim.
Zapisywanie dla każdej zmiennej jako projekt gimp xcf jest w zasadzie bez sensu i niepotrzebne, do takiego wniosku doszedłem. W wątku jest też o pobieraniu danych z pliku zewnętrznego. Chyba najlepszym rozwiązaniem byłoby tworzenie warstwy dla każdej nowej zmiennej i po eksporcie do PNG jej usuwanie. Druga droga to utworzenie warstw dla wszystkich zmiennych i ich aktywowanie do eksportu, ale to na pewno zamuli program i zeżre niepotrzebnie dużo zasobów. Dawno temu programowałem w Delphi gdzie RAM był w ilości 64MB, no to pamiętam czego nie powinno się robić, żeby szanować zasoby sprzętowe :-) Plik xcf z tego wątku ma 260MB a to tylko 128kart, więc wydaje się, że trzeba projekty dobrze przemyśleć. Chyba, że grafika jest trzymana w tym pliku i dlatego taki rozmiar.


Tytuł: Odp: Generowanie dużej ilości plików PNG z pliku TXT
Wiadomość wysłana przez: Gimpo-cienias on 26.01.2022, 13:33:51
Zatrzymało mnie na takim etapie:


#!/usr/bin/env python
from gimpfu import *
import csv

with open('D:\GimpSkrypty\skrypt1.csv') as plik:
 readCSV = csv.reader (plik, delimiter=";")
 for wiersz in readCSV:
  nrwiersza=wiersz[0] # to bede uzywac do nadania nazwy pliku
  napis=wiersz[1] #to bede uzywac do stworzenia napisu
  hello_world(napis)


#http://www.efalk.org/Docs/Python/gimp-examples.html - stad wzialem i przerobilem poniasza funkcje:
def hello_world(napis):
      if font == 'Comic Sans MS' :
       initstr = "Comic Sans? Are you sure?"

img = gimp.Image(1, 1, RGB)
pdb.gimp_context_push()
gimp.set_foreground(125, 175, 188)
layer = pdb.gimp_text_fontname(img, None, 0, 0, napis, 10, True, 100, PIXELS, "Tahoma")
img.resize(layer.width, layer.height, 0, 0)
background = gimp.Layer(img, "Background", layer.width, layer.height, RGB_IMAGE, 100, NORMAL_MODE)
background.fill(BACKGROUND_FILL)
img.add_layer(background, 1)
gimp.Display(img)
gimp.displays_flush()
pdb.gimp_context_pop()
return


A tak to wygląda na konsoli:
>>>
>>>
>>> #!/usr/bin/env python
>>> from gimpfu import *
>>> import csv
>>>
>>> with open('D:\GimpSkrypty\skrypt1.csv') as plik:
...  readCSV = csv.reader (plik, delimiter=";")
...  for wiersz in readCSV:
...   nrwiersza=wiersz[0] # to bede uzywac do nadania nazwy pliku
...   napis=wiersz[1] #to bede uzywac do stworzenia napisu
...   hello_world(napis)
...
Traceback (most recent call last):
  File "<input>", line 6, in <module>
TypeError: hello_world() takes no arguments (1 given)
>>>
>>> #http://www.efalk.org/Docs/Python/gimp-examples.html - stad wzialem i przerobilem ponizsza funkcje:
>>> def hello_world(napis):
...       if font == 'Comic Sans MS' :
...        initstr = "Comic Sans? Are you sure?"
...
>>> img = gimp.Image(1, 1, RGB)
>>> pdb.gimp_context_push()
>>> gimp.set_foreground(125, 175, 188)
>>> layer = pdb.gimp_text_fontname(img, None, 0, 0, napis, 10, True, 100, PIXELS, "Tahoma")
>>> img.resize(layer.width, layer.height, 0, 0)
>>> background = gimp.Layer(img, "Background", layer.width, layer.height, RGB_IMAGE, 100, NORMAL_MODE)
>>> background.fill(BACKGROUND_FILL)
>>> img.add_layer(background, 1)
>>> gimp.Display(img)
<display>
>>> gimp.displays_flush()
>>> pdb.gimp_context_pop()
>>> return
  File "<input>", line 1
SyntaxError: 'return' outside function

>>>
>>>
>>>
Jakoś nie wyskakuje mi z tej funkcji z powrotem do pętli, tworzy obrazek tak jak trzeba, ale tylko jeden z napisem "jeden". Ten pierwszy problem też pewnie ma jakieś znaczenie. Co tu trzeba poprawić?
To moje pierwsze kroki z Pythonem i pierwsze wrażenie jest takie, że jakiś sadysta wymyślił te wcięcia, gdzie jedna spacja za mało lub za dużo rozwala wszystko :-(
Już mi ten projekt chyba nie będzie potrzebny, ale z czystej ciekawości chcę to zrobić.



Tytuł: Odp: Generowanie dużej ilości plików PNG z pliku TXT
Wiadomość wysłana przez: Ziomioslaw on 26.01.2022, 18:56:05
Masz wcięcia nieprawidłowe, pół funkcji Ci zniknęło:

Cytuj
#!/usr/bin/env python
from gimpfu import *
import csv

with open('D:\GimpSkrypty\skrypt1.csv') as plik:
    readCSV = csv.reader (plik, delimiter=";")
    for wiersz in readCSV:
        nrwiersza=wiersz[0] # to bede uzywac do nadania nazwy pliku
        napis=wiersz[1] #to bede uzywac do stworzenia napisu
        hello_world(napis)


#http://www.efalk.org/Docs/Python/gimp-examples.html - stad wzialem i przerobilem poniasza funkcje:
def hello_world(napis):
    if font == 'Comic Sans MS':
        initstr = "Comic Sans? Are you sure?"

    img = gimp.Image(1, 1, RGB)
    pdb.gimp_context_push()
    gimp.set_foreground(125, 175, 188)
    layer = pdb.gimp_text_fontname(img, None, 0, 0, napis, 10, True, 100, PIXELS, "Tahoma")
    img.resize(layer.width, layer.height, 0, 0)
    background = gimp.Layer(img, "Background", layer.width, layer.height, RGB_IMAGE, 100, NORMAL_MODE)
    background.fill(BACKGROUND_FILL)
    img.add_layer(background, 1)
    gimp.Display(img)
    gimp.displays_flush()
    pdb.gimp_context_pop()


Tytuł: Odp: Generowanie dużej ilości plików PNG z pliku TXT
Wiadomość wysłana przez: Gimpo-cienias on 26.01.2022, 20:03:47
Dziękuję za pomoc :-)