Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Gdi+

Ostatnio zmodyfikowano 2024-11-15 22:20
Autor Wiadomość
KKR
Temat założony przez niniejszego użytkownika
Gdi+
» 2024-11-13 14:33:07
HDC          hdc;

PAINTSTRUCT  ps;

hdc = BeginPaint(hwnd, &ps);
           
Graphics    graphics(hdc);

Image image(L"C:\\my_żółć.png");

graphics.DrawImage(&image, 50, 50);
           
EndPaint(hwnd, &ps);


Funkcja nie ładuje pliku z polskimi znakami.
P-181904
pekfos
» 2024-11-13 19:17:51
A bez polskich znaków działa? Jak nie ładuje, to jaki błąd jest zwracany z image.GetLastStatus() zaraz po załadowaniu obrazu?
P-181905
KKR
Temat założony przez niniejszego użytkownika
» 2024-11-13 20:12:10
Bez polskich znaków jest ok, ładuje każdy plik graficzny.

error:: no matching function for call to gdiplus::Image::Image(const char[19])

"brak pasującej funkcji do wywołania"

20 lat pisałem w VB6, C++ -sa się ucze tyle o ile.
P-181906
pekfos
» 2024-11-13 20:18:10
Zgubiłeś L na początku napisu. Wróć do poprzedniego kodu i podaj kod błędu z działania programu.
P-181907
KKR
Temat założony przez niniejszego użytkownika
» 2024-11-13 21:49:02
Nie pominołem "L"

to działa:
Image image(L"D:/Tapety/brick-wall-3170274_1920.jpg");

a to nie:
Image image(L"D:/ółśżć/brick-wall-3170274_1920.jpg");

np to:
Element[Ilosc_Ikon].Sci="D:/ółśżć/ikón.exe"
Element[Ilosc_Ikon].Iko=ExtractAssociatedIcon(Hin_Instance,LPSTR(Element[Ilosc_Ikon].Sci.c_str()),&index);
działa poprawnie

albo na przykład:
wczytywanie plików za pomocą "fstream"
scierzka do pliku z okna wyboru pliku czy katalogu
lub co kolwiek innego działa poprawnie.

Tylko to co pochodzi z GDI+ wywala błąd.

W VB6 to wygląda tak "fragment kodu"
GdipLoadImageFromFile StrPtr("D:\Pobrane\ółśćż\ółśćż.jpg"), lngPointer
GdipDrawImage m_lngGraphics, lngPointer, 0, 0

Czyli wychodzi na to że problem nie leży w GDI+ tylko w przekonwertowaniu scierzki pliku w C++
Tak mi się wydaje.
P-181908
DejaVu
» 2024-11-13 21:51:34
Może plik nie jest zapisany jako UTF-8/Unicode, tylko w lokalnym ISO, więc źle działa zapis z L''?

/edit:
ChatGPT 4o:
Problem z wczytywaniem pliku o nazwie zawierającej polskie znaki (np. żółć) w funkcji Image z GDI+ może wynikać z kilku przyczyn:

Kodowanie pliku źródłowego: Jeśli plik źródłowy nie jest zapisany w kodowaniu obsługującym znaki Unicode (np. UTF-8 lub UTF-16), kompilator może nieprawidłowo interpretować polskie znaki w ścieżce.

Ustawienia projektu: W niektórych środowiskach programistycznych, takich jak Visual Studio, należy upewnić się, że projekt jest skonfigurowany do obsługi znaków Unicode. W Visual Studio można to ustawić w opcjach projektu, wybierając Use Unicode Character Set.

Ścieżka do pliku: Upewnij się, że plik o nazwie my_żółć.png faktycznie istnieje pod podaną ścieżką i że aplikacja ma odpowiednie uprawnienia do jego odczytu.

Rozwiązanie:

Upewnij się, że plik źródłowy jest zapisany w kodowaniu obsługującym Unicode: W edytorze kodu wybierz odpowiednie kodowanie, np. UTF-8.

Sprawdź ustawienia projektu: W Visual Studio przejdź do ustawień projektu i upewnij się, że zestaw znaków jest ustawiony na Unicode.

Zastosuj prefiks L przed ścieżką: Użycie prefiksu L przed ciągiem znaków tworzy szerokoznakowy ciąg znaków (wide string), co jest wymagane przez funkcje GDI+.

C/C++
Image image( L"C:\\my_żółć.png" );
Sprawdź istnienie pliku: Upewnij się, że plik my_żółć.png znajduje się w podanej lokalizacji i że aplikacja ma do niego dostęp.

Jeśli po wprowadzeniu powyższych zmian problem nadal występuje, warto rozważyć zmianę nazwy pliku na taką, która nie zawiera polskich znaków, aby wykluczyć problemy związane z kodowaniem i obsługą znaków specjalnych.
P-181909
pekfos
» 2024-11-13 21:59:24
To działa poprawnie?
C/C++
MessageBoxW( NULL, L"C:\\my_żółć.png", L"test", MB_OK );
P-181910
KKR
Temat założony przez niniejszego użytkownika
» 2024-11-13 22:42:21
MessageBoxW( NULL, L"C:\\my_żółć.png", L"test", MB_OK );
Nie działa
D:\Programowanie\C++\test\main.cpp|67|error: converting to execution character set: Illegal byte sequence|

MessageBox( NULL, "C:\\my_żółć.png", "test", MB_OK );
Działanie poprawne, okno msg wyświetla "C:\\my_żółć.png"

Tak jak pisałem VB6 nie ma problemu ten sam istniejący plik "C:\my_żółć.png":
GdipLoadImageFromFile StrPtr("C:\my_żółć.png"), lngPointer
Ładuje poprawnie.
W Codeblock jest problem, tak jak wspomniałe tylko z GDI+

Cokolwiek polskiego w sicierzce do pliku to z GDI+ jest problem.
P-181911
« 1 » 2
  Strona 1 z 2 Następna strona