Windows Image Acquisition i Nikon D800 - jak rozpocząć?

0

Witam,

Chciałbym obsłużyć swój aparat Nikon D800 z poziomu Delphi. Próbowałem wykorzystać do tego celu SDK wypuszczony przez producenta, ale połamałem zęby na tym w pewnym momencie. Dlatego stwierdziłem, że może lepiej i prościej będzie użyć do tego celu WIA 2.0.

Naturalnie najpierw poszukałem w necie coś na ten temat, i zrobiłem pierwsze kroki.
Najpierw utworzyłem pusty projekt VCL. Następnie w menu Component - Import Component wybrałem Import a Type Library. Z listy wybrałem Microsoft Windows Image Acquisition Library 2.0, wybrałem nazwę palety "WIA", a następnie Create Unit. W rezultacie pojawił się nowy plik WIA_TLB.lib.
I teraz pytanie: jak to zacząć? Znalazłem tutorial po niemiecku, lecz widać wyraźnie, że to nie ta wersja WIA.

Cciałbym w rezultacie uzyskać dostęp do aparatu, do takich rzeczy jak: ustawienie czułości, czasu, przesłony itp, oraz wykonanie zdjęcia i pobranie go na dysk (nie tylko w formacie JPG, ale również NEF).

Czy może ktoś z Was miał kontakt z tym?

Dziękuję bardzo za sugestie

0

Oficjalna dokumentacja WIA jest tutaj.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms630827(v=vs.85).aspx
Przykłady będą niestety w C++.

0

Eee... ale o co pytasz? Masz odpowiedni unit wygenerowany z biblioteki typów (TLB), a więc masz Delphiowe opakowanie na obiekty COM.
Po prostu ich używasz, bardzo prosty przykład jest tu:
https://gist.github.com/stijnsanders/1724324
Co do reszty jeśli idzie o WIA - nie znam się, nie pomogę - musisz kombinować.

0

@wloochacz, ten link co podałeś, właśnie opisuje starszą wersję WIA (WIALib_TLB), a nie obecny (WIA_TLB).

Pytanie odnosi się właśnie tego, od czego zacząć - w unicie jest mnóstwo rzeczy, ale nie jest wyjaśnione jak rozpocząć (wybór urządzenia, łączenie, ustawienie parametrów, pobranie obrazka itp).

0

W tym linku co podałem jest pokazane JAK ZACZĄĆ.
A to, że inna wersja? I co z tego, pewnie jest podobnie...
Poza tym, no wybacz że nie ma komponentów dla Delphi, ale jest tutorial w C# (pewnie i znajdziesz dla C++ lub VB.NET):
http://msdn.microsoft.com/en-us/library/windows/desktop/ms629859%28v=vs.85%29.aspx
Obiekty są te same, metody też używa się tego też tak samo - w końcu to COM.
Oczywiście znajomość czytania kodu w C# będzie niezbędna, ale to przecież dla Ciebie pikuś.

0

@wloochacz, wersje WIA i WIA2 różnią się sporo. Np. w WIA2 nie ma czegoś takiego jak np. IWia, co było pokazane w przykładzie:

procedure TForm1.Button1Click(Sender: TObject);
var
    wia:IWia;
    wiad:OleVariant;
    wiax:IWiaDispatchItem;
    i:integer;
    tc1,tc2:cardinal;
begin
    tc1:=GetTickCount;
    wia:=CoWia.Create;
    if ComboBox1.ItemIndex=-1 then
    begin
         for i:=0 to wia.Devices.Count-1 do
         ComboBox1.Items.Add((wia.Devices.Item[i] as IWiaDeviceInfo).Name);
    end
    else
    begin 
         wiad:=wia.Devices.Item[ComboBox1.ItemIndex] as IWiaDeviceInfo;
         wiax:=wia.Create(wiad).TakePicture;
         wiax.Transfer('C:\Data\R&D\Delphi\WIA\test.bmp',false);
         tc2:=GetTickCount;
         Image1.Picture.LoadFromFile('C:\Data\R&D\Delphi\WIA\test.bmp');
         Caption:=IntToStr(tc2-tc1)+'ms '+IntToStr(Image1.Picture.Width)+'x'+IntToStr(Image1.Picture.Height);
    end;
end;

W przykładzie w MSDN w języku C++ pokazano to w następujący sposób (zaczyna się od Device Managera):

    HRESULT CreateWiaDeviceManager( IWiaDevMgr2 **ppWiaDevMgr ) //Vista or later
    {
        //
        // Validate arguments
        //
        if (NULL == ppWiaDevMgr)
        {
            return E_INVALIDARG;
        }

        //
        // Initialize out variables
        //
        *ppWiaDevMgr = NULL;

        //
        // Create an instance of the device manager
        //

        //Vista or later:
        HRESULT hr = CoCreateInstance( CLSID_WiaDevMgr2, NULL, CLSCTX_LOCAL_SERVER, IID_IWiaDevMgr2, (void**)ppWiaDevMgr ); 

        //
        // Return the result of creating the device manager
        //
        return hr;
    }

W WIA_TLB brakuje takich rzeczy jak IWiaDevMgr2 czy CoCreateInstance.
Dlatego nie wiem jak znaleźć punkt zaczepienia, żeby od czegoś zacząć... Chodzi np. o przykład w Delphi który będzie działał z WIA2.

0
  1. coś się czepił tego WIA2
  2. jak się jakaś nazwa w C++ różni, to chyba logiczne, że taka sama różnica będzie w Delphi.
  3. CoCreateInstance to standardowa funkcja WinAPI. można ją w Delphi wywołać bezpośrednio, albo przez konstruktor, jak w linijce
    wia:=CoWia.Create; // CoCreateInstance(cośtam, cośtam, wia);
  1. zamiast żebrać o gotowca - myśl, kombinuj, i pytaj na czym się zaciąłeś..
0

Ad.1. Nie mam dostępnego WIA, Delphi wygenerował mi dostępny tylko WIA2. Jeśli chodzi o inne sposoby kontroli Nikona D800 poza SDK Nikona i WIA2, to prosiłbym o ich podanie.
Ad.2. Nie rozumiem tego stwierdzenia, do czego się odnosi?
Ad.3. Dzięki, nie wiedziałem.
Ad.4. Zaciąłem się na samym wstępie - przecież opisałem co zrobiłem - import biblioteki, mam unita i nie wiem co dalej. Gdyby był jakiś gotowiec, nie pisałbym tutaj.

Kolejna rzecz: proszę o wypowiedzi osób, które faktycznie się z tym zetknęli.

Tutorial z MSDNa na temat WIA jest tutaj: http://msdn.microsoft.com/en-us/library/windows/desktop/ms629859%28v=vs.85%29.aspx
Fragment który wkleiłem w poprzednim poście jest stąd: http://msdn.microsoft.com/en-us/library/windows/desktop/ms629848%28v=vs.85%29.aspx
Pytania:

  1. Jak mam rozumieć IWiaDevMgr2? Czy to ma być IDeviceManager z WIA_TLB?
  2. Co to jest CLSID_WiaDevMgr2 i IID_IWiaDevMgr2? Delphi mi wskazuje, że to mają być System.GUID.
0

Co to jest CLSID_WiaDevMgr2 i IID_IWiaDevMgr2?

class identifier - GUID klasy (tutaj WinDevMgr2)
interface identifier - GUID interfejsu (tutaj IWiaDevMgr2)

Delphi jakoś tam to automatyzuje że się jawnie nie podaje GUIDów przy tworzeniu obiektu.

0

Teraz się zastanawiam - właśnie podłączyłem Nikona D800 (dostałem go wreszcie do ręki) i uruchomiłem Irfana Viewa. Ma on możliwość pobrania obrazków za pośrednictwem TWAIN/WIA, i widoczny był ten aparat. Tylko tyle - że pozwalał on tylko na zajrzenie do katalogu na karcie pamięci, wykonanie zdjęcia (możliwe tylko wtedy gdy jest podłączona karta pamięci), ale nigdzie nie ma możliwości ustawienia parametrów aparatu (ISO, Tv, Av itp). Czy może ktoś wie, czy to jest w ogóle możliwe za pomocą WIA? Jeśli nie, to będę próbował jednak dalej z tym SDK od Nikona...

Ze strony http://stackoverflow.com/questions/10472647/wia-2-on-windows-7-delphi skorzystałem z przykładu wykonania WIA2 pod Delphi - i co więcej - działa.
W załączniku daję screena z ustawieniami Nikona i wychodzi na to, że tam nie ma nic czym można byłoby go ustawiać...

Jednak wracam do SDK.

0

archer ten wygnerowany plik to jest WIA Automation i tutaj masz przyklady w VB

http://msdn.microsoft.com/en-us/library/windows/desktop/ms630826%28v=vs.85%29.aspx

user image

1 użytkowników online, w tym zalogowanych: 0, gości: 1