|
Corel FORUM
Forum użytkowników programów firmy Corel. Grafika wektorowa, rastrowa i obróbka zdjęć cyfrowych
|
Ładowanie obrazka do PictureBoksa |
Autor |
Wiadomość |
Martin Nez
Doradca Grafik?
Wersja CorelDRAW: 2019
Pomógł: 14 razy Dołączył: 29 Sty 2011 Posty: 114 Skąd: Czmoń
|
Wysłany: 6 Luty 2015, 21:11 Ładowanie obrazka do PictureBoksa
|
|
|
Witam,
mam problem z pewnym skryptem... Otóż w oknie mam wrzucony PictureBox o nazwie "imgPodglad", a kod wygląda tak:
Kod: | Private Sub lbxListaPozycji_Click()
' załadowanie miniatury obrazka
Dim picObraz As StdPicture
Set picObraz = Nothing
Set picObraz = LoadPicture(sciezka & "plik.jpg")
imgPodglad.Picture = picObraz
End Sub |
Problem dotyczy działania tego kodu z plikami jpg zapisanymi w CMYKu (z RGB jest wszystko ok). Otóż program wiesza się wywalając błąd "Automation error" (cokolwiek to jest).
Szukam rozwiązania, które pozwoli wciągać do tego boksa obrazy w CMYKu lub chociaż rozpozna czy obrazek jest RGB czy CMYKiem i wywali odpowiedniego MsgBoksa.
W sumie z tego co kojarzę ludzi tutaj to pewnie pytanie do MaroQ lub chezare'a, więc Wy dwoje zwróćcie proszę szczególnie uwagę czy nie spotkaliście się może z takim problemem.
Pozdr,
MN |
|
|
|
|
bidon184 [Usunięty]
|
Wysłany: 6 Luty 2015, 21:33
|
|
|
nie znam sie na skryptach do corela ale np we flash ten wers Set picObraz = LoadPicture(sciezka & "plik.jpg") robi duza roznice poniewaz nie zawiera informacji o pliku czyli exif moim zdanie powinno wystarczyć zamiana koncowki na jpeg |
|
|
|
|
Martin Nez
Doradca Grafik?
Wersja CorelDRAW: 2019
Pomógł: 14 razy Dołączył: 29 Sty 2011 Posty: 114 Skąd: Czmoń
|
Wysłany: 6 Luty 2015, 21:41
|
|
|
bidon184,
Sprawdziłem na szybko i niestety w moim przypadku to nic nie daje...
Swoją drogą całe szczęście, bo mam folder z 12 000 zwymiarowanych zdjęć zapisanych w jpg. ;D
Ale dzięki za chęci. :) Gdyby coś jeszcze przyszło Ci do głowy daj znać.
Pozdr,
MN |
|
|
|
|
bidon184 [Usunięty]
|
Wysłany: 7 Luty 2015, 13:29
|
|
|
no raczej na nic wiecej nie wpadne bo jednak cmyk to rzeczywistosc a flash to wirtual,ale osobnicy ktorych wymieniles twardo stoja na ziemi wiec zapewne pomysly maja ,no hym,ogolnie to z ta miniatura jest cos nie tak bo miniatury sa w rgb mimo ze podglad jest np w tiff,hym no nie wiem nie bede sie wymądrzał,są o wiele lepsi ode mnie |
|
|
|
|
chezare
Pomógł: 402 razy Dołączył: 24 Gru 2010 Posty: 4551 Skąd: Grodzisk Mazowiecki
|
Wysłany: 7 Luty 2015, 14:33
|
|
|
Bardzo to miłe, że ktoś uważa mnie za fachowca od pisania makr w Corelu, ale prawda jest niestety taka, że nie mam o tym bladego pojęcia, a to że rozwiązałem dwa problemy na krzyż i to pewnie w ułomny sposób, to wynik tego, że uważam, że to nie ma nic wspólnego z czarną magią i jak ktoś chce, to może
Szaman to co innego, bez problemu ustali dlaczego ta metoda nie lubi cmyka.
Ja bym mógł się temu przyjrzeć, bez żadnej gwarancji że coś wymyślę, ale póki co, to nie mam pojęcia co to jest ten picturebox i jak to się wstawia do dokumentu Corela? |
|
|
|
|
Martin Nez
Doradca Grafik?
Wersja CorelDRAW: 2019
Pomógł: 14 razy Dołączył: 29 Sty 2011 Posty: 114 Skąd: Czmoń
|
Wysłany: 7 Luty 2015, 20:30
|
|
|
chezare
nie do dokumentu, a do UserForma w VBA. ;] Spróbuj, może na coś wpadniesz...
Pozdr,
MN |
|
|
|
|
chezare
Pomógł: 402 razy Dołączył: 24 Gru 2010 Posty: 4551 Skąd: Grodzisk Mazowiecki
|
Wysłany: 8 Luty 2015, 00:24
|
|
|
Dalej jestem głupi.
Mógłbyś opisać o co w tym chodzi? Jak to działa?
To ma być coś takiego jak okno do importu grafiki?
Z tego co ja widzę, to obrazek w formularzu można umieścić poprzez komponent o nazwie Image, albo jako tło formatki?
Ja mam tutaj zabytkowego Corela, może w nowszych wersjach lista komponentów jest inna,
PictureBox to to samo co Image?
|
|
|
|
|
Martin Nez
Doradca Grafik?
Wersja CorelDRAW: 2019
Pomógł: 14 razy Dołączył: 29 Sty 2011 Posty: 114 Skąd: Czmoń
|
Wysłany: 8 Luty 2015, 11:32
|
|
|
Dokładnie to samo. Sorry, że nie dałem od razu screena, a nawet nie myślałem, że ten komponent ma inną nazwę... Więc jak już masz taki formularz to teraz chodzi o to, że nie mogę załadować jpga w CMYKu, a działa tylko z RGB.
Pozdr,
MN |
|
|
|
|
maroQ
Doradca
Pomógł: 16 razy Wiek: 40 Dołączył: 08 Lut 2011 Posty: 117 Skąd: Kalisz
|
Wysłany: 8 Luty 2015, 11:59
|
|
|
Martin Nez napisał/a: | Szukam rozwiązania, które pozwoli wciągać do tego boksa obrazy w CMYKu lub chociaż rozpozna czy obrazek jest RGB czy CMYKiem i wywali odpowiedniego MsgBoksa. |
Nie wiem czy nie wymagasz zbyt wiele od VBA. VBA to stare dobre VB6. Środowiska (Visual Studio 6.0) nie wgra się poprawnie na systemach nowszych niż Windows 98 bez uzyskania zagrożenia dla .NET
Już to kiedyś przerabiałem psując całkiem komunikację z .NET
Jeśli bardzo potrzebujesz otwierać obrazki 32bitowe to przejdź na nowszą technologię czyli VB.NiET. Różnice między VB6, a VB.NiET są takie, że to co było proste i przyjemne w VBA zaczyna być skomplikowane i pracochłonne w VB.NET. Natomiast jak się już przestawi na VB.NET to nie bardzo chce się wracać do VB6. Choćby z uwagi na bardzo łatwą integrację bibliotek z C#, C++ i VB.NET. Można mieć "solution" z projektami w różnych językach .NET (ale nie wolno mieszać różnych frameworków) i kompilować wszystko razem jednym przyciskiem. Da się podpinać biblioteki pisane w Fortranie, starym C++ (bez .NET), pascalem itp. (łatwe to nie jest, ale się da).
VB.NET to język wysokiego poziomu nie działający na niskim poziomie jak VB6, ale operujący na gotowych rozwiązaniach. Ponieważ wymaga on "visual c++ {wersja VS} redistributable" więc można przypuszczać, że spora część języka nie była pisana w VB6, a w C++. Początkowo programiści VB6 nazywali takie podejście zdradą. Obecnie bez przejścia na VB.NET ciężko jest pisać coś bardziej skomplikowanego. Łączność z bazą z poziomu VBA to nie to samo co łączność z bazą w VB.NET. Naprawdę możliwości nowych wersji Visual Basica poszły znacznie do przodu.
Można by pokusić się o napisanie biblioteki ActiveX w VB.NET i uruchamiać ją z poziomu VBA. Już to kiedyś robiłem, ale to trochę sztuka dla sztuki bo można przejść na VB.NET i napisać całą przeglądarkę grafiki dużo prościej. Można nawet pobrać jakiś gotowy projekt na rozsądnej licencji i dopasować go do własnych celów.
Testowałem ładowanie obrazków w VB.NET z .NET4 i nie ma żadnych problemów z odczytem 32bitowych CMYKów. Prawdopodobnie ta kontrolka dostępna w VBA wspiera tylko 24bitowe obrazki. Możesz poszukać kontrolek lub bibliotek ze starego VB6 i na nim sprawdzić czy się da, ale mam wątpliwości czy to aby napewno pomoże.
Najnowszy standard JPEG na pewno nie będzie wspierany. Ostatnia wersja VB6 została wydana w 1998 roku, a po wprowadzeniu VB.NET język praktycznie umarł. Standardy T.86, T.871 i T.872 raczej nie będą wspierane. Porównań z flashem lepiej nie robić bo flash rozwija się cały czas.
W najnowszej wersji tj. Corel Draw X7 zmieniono całkiem komunikację z Corelem rezygnując z łączności z CorelDraw na rzecz VGCore. To jest kłopotliwe dla każdego kto chciał by przenieść swój program z Corela Draw X3 lub nowszego na X7 nie mówiąc już o problemach z przenoszeniem makr poniżej X3. Zmian jest sporo, więc zamknięcie całej obsługi makra w jednej łatwej do przekompilowania bibliteki może być dobrym rozwiązaniem, chociaż powoduje powstanie problemów z zasięgiem zmiennych i koniecznością tworzenia mostów między aplikacją główną, a bibliotekami.
W VBA nie mam mowy o tych wszystkich problemach z VB.NET. Podpina się plik gms i właściwie jeśli są jakieś zmiany w kodzie to raczej są one niewielkie. No ale coś za coś. |
|
|
|
|
Martin Nez
Doradca Grafik?
Wersja CorelDRAW: 2019
Pomógł: 14 razy Dołączył: 29 Sty 2011 Posty: 114 Skąd: Czmoń
|
Wysłany: 8 Luty 2015, 17:47
|
|
|
Witam,
co prawda nie odpowiedziałeś na moje pytanie, ale Twój wywód n/t VB.NET mnie zainteresował. Niestety nie wiem nawet jak zacząć, może masz jakiś prosty przykład, który mógłbym wykorzystać do analizy? Może to być nawet prosta aplikacja wywalająca formularz z jakimś Labelem lub czymś takim. Chodzi mi bardziej o technikę połączenia tego z Corelem itp. Dotychczas pracowałem tylko z plikami GMS.
Niestety nie przerobię już teraz całego makra na VB.NET, ponieważ zbyt dużo czasu poświęciłem na napisanie tego co już mam, a ten błąd z plikami cmykowymi to w sumie taki detal, który stwierdziłem, że muszę poprawić.
Co do mojego problemu - zauważyłem, że wcale nie chodzi o pokazanie obrazka w komponencie Image... Błąd wyskakuje linię wcześniej - przy ładowaniu pliku do picObraz (StdPicture). Może w związku z tym jakieś pomysły?
Pozdr,
MN |
|
|
|
|
chezare
Pomógł: 402 razy Dołączył: 24 Gru 2010 Posty: 4551 Skąd: Grodzisk Mazowiecki
|
Wysłany: 9 Luty 2015, 20:59
|
|
|
Przyjrzałem się temu komponentowi w starym vba i niestety Szaman ma rację, numer z grafiką 32 bitową nie przejdzie.
Jeśli dobrze zrozumiałem i te obrazki mają służyć tylko do jakiegoś podglądu, to można je przekonwertować do rgb, ilość nie jest przeszkodą, wiele prostych programów zrobi to automatycznie, albo zapomnieć o starym vba?
Zresztą wyświetlanie grafiki w CMYK na monitorze nie wydaje mi się rzeczą naturalną, bo do wyświetlania i tak musi to zostać zamienione na RGB? |
|
|
|
|
Martin Nez
Doradca Grafik?
Wersja CorelDRAW: 2019
Pomógł: 14 razy Dołączył: 29 Sty 2011 Posty: 114 Skąd: Czmoń
|
Wysłany: 9 Luty 2015, 23:02
|
|
|
Też niestety nie trafiłem jeszcze na rozwiazanie mojego problemu...
Nie byłoby przeszkodą przekonwertowanie wszystkich 12 000 obrazków na RGB (przecież można napisać krótkie makro do Corela PP ;) ), ale chciałbym zabezpieczyć się na przyszłość. Niestety do folderu z tymi obrazami nie tylko ja wrzucam zdjęcia, a nie sposób kontrolować każdego nowego pliku, który ktoś zapisze. Dlatego chciałbym, żeby chociaż wyskakiwał MsgBox zamiast zawieszania makra.
Co do zapisywania i wyświetlania grafik w CMYKu - Ty to wiesz, ja to wiem... ;] Ale nie każdy w firmie, w której pracuję. ;)
Mimo wszystko - dziękuję za chęć pomocy.
Pozdr,
MN |
|
|
|
|
chezare
Pomógł: 402 razy Dołączył: 24 Gru 2010 Posty: 4551 Skąd: Grodzisk Mazowiecki
|
Wysłany: 11 Luty 2015, 11:52
|
|
|
Zorganizuje obsługę błędów i procedura nie będzie się wykolejała przy próbie otwarcia obrazka w nieakceptowanym formacie, np. tak;
Private Sub lbxListaPozycji_Click()
' załadowanie miniatury obrazka
Dim picObraz As StdPicture
on error resume next
Set picObraz = Nothing
Set picObraz = LoadPicture(sciezka & "plik.jpg")
imgPodglad.Picture = picObraz
End Sub
albo z komunikatem
Private Sub lbxListaPozycji_Click()
' załadowanie miniatury obrazka
Dim picObraz As StdPicture
Set picObraz = Nothing
on error goto blad
Set picObraz = LoadPicture(sciezka & "plik.jpg")
imgPodglad.Picture = picObraz
goto koniec
blad:
msgbox "Nieakceptowany format grafiki"
koniec:
End Sub |
|
|
|
|
maroQ
Doradca
Pomógł: 16 razy Wiek: 40 Dołączył: 08 Lut 2011 Posty: 117 Skąd: Kalisz
|
Wysłany: 11 Luty 2015, 23:51
|
|
|
Tu macie trochę fajniejszą funkcję z obsługą różnych błędów i obrazkiem domyślnym (na wypadek błędu coś się itak wyświetli).
Kod: | Private dirname As String
Sub OpenPicture(ByVal pname As String, Optional ByVal defaultImg As String)
On Error GoTo blad
'info: https://msdn.microsoft.com/en-us/library/aa264946%28v=vs.60%29.aspx
If defaultImg = "" Then
Image1.Picture = LoadPicture()
Else
Image1.Picture = LoadPicture(defaultImg)
End If
Image1.Picture = LoadPicture(pname, , , Color)
GoTo koniec
blad:
Select Case err.Number
Case 53
MsgBox "Nie znaleziono pliku!", vbExclamation, "Error " & err.Number
Case 481
MsgBox "Nieobsługiwany typ obrazka!" & vbNewLine & "Obsługiwane formaty: bitmapa (.bmp), ikona (.ico), kursor (.cur), run-length encoded (.rle), metafile (.wmf), enhanced metafile (.emf), GIF (.gif), JPEG (.jpg)", vbInformation, "Error " & err.Number
Case -2147467259
MsgBox "Nieobsługiwany obrazek np. CMYK! ", vbInformation, "Error " & err.Number
Case Else
MsgBox "Wystąpił błąd: " & err.Description, vbCritical, "Error " & err.Number
End Select
koniec:
End Sub
Private Sub UserForm_Initialize()
dirname = "c:\"
Call OpenPicture(dirname & "pirate.jpg")
End Sub
Private Sub CommandButton1_Click()
Call OpenPicture(dirname & "Rysunek1RGB.jpg", dirname & "pirate.jpg")
End Sub
Private Sub CommandButton2_Click()
Call OpenPicture(dirname & "Rysunek1CMYK.jpg", dirname & "pirate.jpg")
End Sub |
Wymagane obiekty w formularzu:
1. Pole Image1
2. Przycisk CommandButton1 z napisem RGB
3. Przycisk CommandButton2 z napisem CMYK
Na dysku trzeba mieć pliki:
1. Rysunek1RGB.jpg
2. Rysunek1CMYK.jpg
3. pirat.jpg
Katalog podajemy w zmiennej dirname.
LoadPicture wspiera maksymalnie 256 kolorów więc o CMYKu nie ma mowy. |
Ostatnio zmieniony przez maroQ 11 Luty 2015, 23:52, w całości zmieniany 1 raz |
|
|
|
|
Martin Nez
Doradca Grafik?
Wersja CorelDRAW: 2019
Pomógł: 14 razy Dołączył: 29 Sty 2011 Posty: 114 Skąd: Czmoń
|
Wysłany: 11 Luty 2015, 23:52
|
|
|
Zadziałało... Że wcześniej nie pomyślałem, żeby to wrzucić w obsługę błędów... :) Dodałem tam ładowanie domyślnego zdjęcia na "brak podglądu" ze ścieżki ustawionej na stałe i teraz super hula...
Ostatecznie procedura wygląda tak:
Kod: | Private Sub lbxListaPozycji_Click()
' załadowanie miniatury obrazka
Dim picObraz As StdPicture
Set picObraz = Nothing
On Error GoTo blad
Set picObraz = LoadPicture(sciezka & lbxListaPozycji.Value & ".jpg")
GoTo koniec
blad:
Set picObraz = LoadPicture(Application.UserDataPath & "Martinez\cmyk.nez")
koniec:
imgPodglad.Picture = picObraz
' aktywacja przycisku
btnOk.Enabled = True
End Sub |
chezare,
że tak Ci przypomnę:
Cytat: | Bardzo to miłe, że ktoś uważa mnie za fachowca od pisania makr w Corelu, ale prawda jest niestety taka, że nie mam o tym bladego pojęcia |
;-)
Czasami wystarczy odejść od kompa na tydzień, żeby rozwiazać jakiś problem... W tym przypadku nie miałem tygodnia, więc poprosiłem o pomoc. :-)
[edit]
maroQ
wpadliśmy w jednym momencie na ten sam pomysł. :-) w sumie niepotrzebne mi żadne komunikaty skoro ładuje domyślny plik, ale i tak dzięki za kody błędów. Może komuś się przydadzą... A może mi na przyszłość...
Jeszcze raz dzięki i pozdr,
MN |
Ostatnio zmieniony przez Martin Nez 11 Luty 2015, 23:58, w całości zmieniany 1 raz |
|
|
|
|
maroQ
Doradca
Pomógł: 16 razy Wiek: 40 Dołączył: 08 Lut 2011 Posty: 117 Skąd: Kalisz
|
Wysłany: 11 Luty 2015, 23:55
|
|
|
Martin Nez napisał/a: | Set picObraz = Nothing |
Po co to?
Is there a need to set Objects to Nothing inside VBA Functions (można używać tego zapisu przy destruktorze zmiennej, chociaż nie jest to konieczne)
Nie bardzo rozumiem po co inicjować obiekt picObraz przez Nothing? Przecież tam już w momencie deklaracji zmiennej pojawia się nothing... |
|
|
|
|
|
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Możesz ściągać załączniki na tym forum
|
Dodaj temat do Ulubionych Wersja do druku
|
|
|
|
|
|
Nowe zasady dotyczące cookies. Wykorzystujemy pliki cookies, aby nasz serwis lepiej spełniał Państwa oczekiwania. Można zablokować zapisywanie cookies, zmieniając ustawienia przeglądarki.
| Strona wygenerowana w 0.11 sekundy. Zapytań do SQL: 12 |
|
|