Udostępnij za pośrednictwem


Praca z obrazami z zadań skryptu

Bazy danych produktów lub użytkownicy często zawiera obrazy oprócz danych tekstowych i liczbowych.System.Drawing Nazw w programie Microsoft.NET Framework udostępnia klasy do manipulowania obrazami.

Przykład 1: Konwersję obrazów w formacie JPEG

Przykład 2: Utwórz i Zapisz miniatur

Ostrzeżenie

Aby utworzyć zadanie łatwiej można użyć ponownie w wielu pakietach, należy rozważyć przy użyciu kodu w tym przykładzie zadanie skryptu jako punktu wyjścia dla niestandardowego zadania.Aby uzyskać więcej informacji, zobacz Opracowywania niestandardowego zadania.

Opis przykład 1: Konwersję obrazów w formacie JPEG

Poniższy przykład otwiera plik obrazu określony przez zmienną i zapisuje go jako plik JPEG skompresowany przy użyciu kodera.Kod, aby pobrać koder informacji jest hermetyzowany w funkcja prywatnych.

Aby skonfigurować ten przykład zadania skryptu do użytku z pojedynczego pliku obrazu

  1. Utwórz zmienną ciąg o nazwie CurrentImageFile i zestaw jej wartość na ścieżka i nazwę istniejącego pliku obrazu.

  2. Na skryptu strona Script Editor zadania, dodać CurrentImageFile do zmiennej ReadOnlyVariables właściwość.

  3. W projekcie skryptu zestaw odwołanie do System.Drawing obszaru nazw.

  4. W kodzie, użyj Imports instrukcji, aby zaimportować System.Drawing i System.IO obszarów nazw.

Aby skonfigurować ten przykład zadania skryptu do użytku z wielu plików obrazów

  1. Umieścić zadania skryptu kontener Foreach pętli.

  2. Na kolekcji strona Edytor pętli Foreach, zaznacz Modułu wyliczającego pliku Foreach jako numerator i określ ścieżka i maska źródło pliki, takie jak "*.bmp."

  3. Na Mapowań zmiennej strona, mapować CurrentImageFile zmiennej indeksu 0.Ta zmienna przekazuje zadanie skryptu w każdej iteracji modułu wyliczającego bieżącej nazwy pliku.

    Ostrzeżenie

    Te kroki są oprócz kroki opisane w procedurze do użytku z pojedynczego pliku obrazu.

Kod przykładowy 1

Public Sub Main()

    'Create and initialize variables.
    Dim currentFile As String
    Dim newFile As String
    Dim bmp As Bitmap
    Dim eps As New Imaging.EncoderParameters(1)
    Dim ici As Imaging.ImageCodecInfo
    Dim supportedExtensions() As String = _
        {".BMP", ".GIF", ".JPG", ".JPEG", ".EXIF", ".PNG", _
        ".TIFF", ".TIF", ".ICO", ".ICON"}

    Try
        'Store the variable in a string for local manipulation.
        currentFile = Dts.Variables("CurrentImageFile").Value.ToString
        'Check the extension of the file against a list of
        'files that the Bitmap class supports.
        If Array.IndexOf(supportedExtensions, _
            Path.GetExtension(currentFile).ToUpper) > -1 Then

            'Load the file.
            bmp = New Bitmap(currentFile)

            'Calculate the new name for the compressed image.
            'Note: This will overwrite existing JPEGs.
            newFile = Path.Combine( _
                Path.GetDirectoryName(currentFile), _
                String.Concat(Path.GetFileNameWithoutExtension(currentFile), _
                ".jpg"))

            'Specify the compression ratio (0=worst quality, 100=best quality).
            eps.Param(0) = New Imaging.EncoderParameter( _
                Imaging.Encoder.Quality, 75)

            'Retrieve the ImageCodecInfo associated with the jpeg format.
            ici = GetEncoderInfo("image/jpeg")

            'Save the file, compressing it into the jpeg encoding.
            bmp.Save(newFile, ici, eps)
        Else
            'The file is not supported by the Bitmap class.
            Dts.Events.FireWarning(0, "Image Resampling Sample", _
                "File " & currentFile & " is not a supported format.", _
                "", 0)
         End If
        Dts.TaskResult = ScriptResults.Success
    Catch ex As Exception
        'An error occurred.
        Dts.Events.FireError(0, "Image Resampling Sample", _
            ex.Message & ControlChars.CrLf & ex.StackTrace, _
            String.Empty, 0)
        Dts.TaskResult = ScriptResults.Failure
    End Try

End Sub

Private Function GetEncoderInfo(ByVal mimeType As String) As Imaging.ImageCodecInfo

    'The available image codecs are returned as an array,
    'which requires code to iterate until the specified codec is found.

    Dim count As Integer
    Dim encoders() As Imaging.ImageCodecInfo

    encoders = Imaging.ImageCodecInfo.GetImageEncoders()

    For count = 0 To encoders.Length
        If encoders(count).MimeType = mimeType Then
            Return encoders(count)
        End If
    Next

    'This point is only reached if a codec is not found.
    Err.Raise(513, "Image Resampling Sample", String.Format( _
        "The {0} codec is not available. Unable to compress file.", _
            mimeType))
    Return Nothing

End Function

Opis przykład 2: Utwórz i Zapisz miniatur

Poniższy przykład otwiera plik obrazu określony przez zmienną, tworzy miniaturę obrazu, zachowując stała proporcje i zapisuje miniatury pod nazwą zmodyfikowanego pliku.Kod, który oblicza wysokość i szerokość miniatury, zachowując stała współczynnik proporcji jest hermetyzowany w prywatnej programowego.

Aby skonfigurować ten przykład zadania skryptu do użytku z pojedynczego pliku obrazu

  1. Utwórz zmienną ciąg o nazwie CurrentImageFile i zestaw jej wartość na ścieżka i nazwę istniejącego pliku obrazu.

  2. Również utworzyć MaxThumbSize Zmienna typu Liczba całkowita i przypisz wartość w pikselach, takie jak 100.

  3. Na skryptu strona Script Editor zadania, dodać zarówno zmienne ReadOnlyVariables właściwość.

  4. W projekcie skryptu zestaw odwołanie do System.Drawing obszaru nazw.

  5. W kodzie, użyj Imports instrukcji, aby zaimportować System.Drawing i System.IO obszarów nazw.

Aby skonfigurować ten przykład zadania skryptu do użytku z wielu plików obrazów

  1. Umieścić zadania skryptu kontener Foreach pętli.

  2. Na kolekcji strona Edytor pętli Foreach, zaznacz Modułu wyliczającego pliku Foreach jako modułu wyliczającegoi określ ścieżka i maska źródło pliki, takie jak "*.jpg."

  3. Na Mapowań zmiennej strona, mapować CurrentImageFile zmiennej indeksu 0.Ta zmienna przekazuje zadanie skryptu w każdej iteracji modułu wyliczającego bieżącej nazwy pliku.

    Ostrzeżenie

    Te kroki są oprócz kroki opisane w procedurze do użytku z pojedynczego pliku obrazu.

Kod przykładowy 2

Public Sub Main()

    Dim currentImageFile As String
    Dim currentImage As Image
    Dim maxThumbSize As Integer
    Dim thumbnailImage As Image
    Dim thumbnailFile As String
    Dim thumbnailHeight As Integer
    Dim thumbnailWidth As Integer

    currentImageFile = Dts.Variables("CurrentImageFile").Value.ToString
    thumbnailFile = Path.Combine( _
        Path.GetDirectoryName(currentImageFile), _
        String.Concat(Path.GetFileNameWithoutExtension(currentImageFile), _
        "_thumbnail.jpg"))

    Try
        currentImage = Image.FromFile(currentImageFile)

        maxThumbSize = CType(Dts.Variables("MaxThumbSize").Value, Integer)
        CalculateThumbnailSize( _
            maxThumbSize, currentImage, thumbnailWidth, thumbnailHeight)

        thumbnailImage = currentImage.GetThumbnailImage( _
           thumbnailWidth, thumbnailHeight, Nothing, Nothing)
        thumbnailImage.Save(thumbnailFile)
        Dts.TaskResult = ScriptResults.Success
    Catch ex As Exception
        Dts.Events.FireError(0, "Script Task Example", _
        ex.Message & ControlChars.CrLf & ex.StackTrace, _
        String.Empty, 0)
        Dts.TaskResult = ScriptResults.Failure
    End Try

End Sub

Private Sub CalculateThumbnailSize( _
    ByVal maxSize As Integer, ByVal sourceImage As Image, _
    ByRef thumbWidth As Integer, ByRef thumbHeight As Integer)

    If sourceImage.Width > sourceImage.Height Then
        thumbWidth = maxSize
        thumbHeight = CInt((maxSize / sourceImage.Width) * sourceImage.Height)
    Else
        thumbHeight = maxSize
        thumbWidth = CInt((maxSize / sourceImage.Height) * sourceImage.Width)
    End If

End Sub
bool ThumbnailCallback()
        {
            return false;
        }
        public void Main()
        {

            string currentImageFile;
            Image currentImage;
            int maxThumbSize;
            Image thumbnailImage;
            string thumbnailFile;
            int thumbnailHeight = 0;
            int thumbnailWidth = 0;
            

            currentImageFile = Dts.Variables["CurrentImageFile"].Value.ToString();
            thumbnailFile = Path.Combine(Path.GetDirectoryName(currentImageFile), String.Concat(Path.GetFileNameWithoutExtension(currentImageFile), "_thumbnail.jpg"));

            try
            {

                currentImage = Image.FromFile(currentImageFile);

                maxThumbSize = (int)Dts.Variables["MaxThumbSize"].Value;
                CalculateThumbnailSize(maxThumbSize, currentImage, ref thumbnailWidth, ref thumbnailHeight);

                Image.GetThumbnailImageAbort myCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback);

                thumbnailImage = currentImage.GetThumbnailImage(thumbnailWidth, thumbnailHeight, ThumbnailCallback, IntPtr.Zero);
                thumbnailImage.Save(thumbnailFile);
                Dts.TaskResult = (int)ScriptResults.Success;
            }
            catch (Exception ex)
            {
                Dts.Events.FireError(0, "Script Task Example", ex.Message + "\r" + ex.StackTrace, String.Empty, 0);
                Dts.TaskResult = (int)ScriptResults.Failure;
            }

        }

        private void CalculateThumbnailSize(int maxSize, Image sourceImage, ref int thumbWidth, ref int thumbHeight)
        {

            if (sourceImage.Width > sourceImage.Height)
            {
                thumbWidth = maxSize;
                thumbHeight = (int)(sourceImage.Height * maxSize / sourceImage.Width);
            }
            else
            {
                thumbHeight = maxSize;
                thumbWidth = (int)(sourceImage.Width * maxSize / sourceImage.Height);

            }

        }
Ikona usług Integration Services (mała)Bieżąco z usług integracji

Najnowsze pliki do pobrania, artykuły, próbki i wideo firmy Microsoft, jak również wybranych rozwiązań ze Wspólnoty, odwiedź witrynę Integration Services strona na MSDN i TechNet:

Aby otrzymywać automatyczne powiadomienia dotyczące tych aktualizacji, zasubskrybuj źródła danych RSS dostępne na tej stronie.