Bekerja dengan Gambar dengan Tugas Skrip

Berlaku untuk: Integration Runtime SSIS SQL Server di Azure Data Factory

Database produk atau pengguna sering menyertakan gambar selain teks dan data numerik. Namespace System.Drawing di Microsoft .NET Framework menyediakan kelas untuk memanipulasi gambar.

Contoh 1: Mengonversi Gambar ke Format JPEG

Contoh 2: Membuat dan Menyimpan Gambar Mini

Catatan

Jika Anda ingin membuat tugas yang dapat digunakan kembali dengan lebih mudah di beberapa paket, pertimbangkan untuk menggunakan kode dalam sampel tugas Skrip ini sebagai titik awal untuk tugas kustom. Untuk informasi selengkapnya, lihat Mengembangkan Tugas Kustom.

Contoh 1 Deskripsi: Mengonversi Gambar ke Format JPEG

Contoh berikut membuka file gambar yang ditentukan oleh variabel dan menyimpannya sebagai file JPEG terkompresi dengan menggunakan encoder. Kode untuk mengambil informasi encoder dienkapsulasi dalam fungsi privat.

Untuk mengonfigurasi contoh Tugas Skrip ini untuk digunakan dengan satu file gambar

  1. Buat variabel string bernama CurrentImageFile dan atur nilainya ke jalur dan nama file file dari file gambar yang ada.

  2. Pada halaman SkripEditor Tugas Skrip, tambahkan CurrentImageFile variabel ke properti ReadOnlyVariables .

  3. Dalam proyek skrip, atur referensi ke namespace layanan System.Drawing .

  4. Dalam kode Anda, gunakan pernyataan Impor untuk mengimpor namespace System.Drawing dan System.IO .

Untuk mengonfigurasi contoh Tugas Skrip ini untuk digunakan dengan beberapa file gambar

  1. Tempatkan tugas Skrip dalam kontainer Foreach Loop.

  2. Pada halaman KoleksiEditor Perulangan Foreach, pilih Enumerator File Foreach sebagai enumerator, dan tentukan jalur dan masker file dari file sumber, seperti "*.bmp."

  3. Pada halaman Pemetaan Variabel , petakan variabel ke CurrentImageFile Indeks 0. Variabel ini meneruskan nama file saat ini ke tugas Skrip pada setiap iterasi enumerator.

    Catatan

    Langkah-langkah ini selain langkah-langkah yang tercantum dalam prosedur untuk digunakan dengan satu file gambar.

Contoh 1 Kode

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  
  

Contoh 2 Deskripsi: Membuat dan Menyimpan Gambar Mini

Contoh berikut membuka file gambar yang ditentukan oleh variabel, membuat gambar mini gambar sambil mempertahankan rasio aspek konstan, dan menyimpan gambar mini dengan nama file yang dimodifikasi. Kode yang menghitung tinggi dan lebar gambar mini sambil mempertahankan rasio aspek konstan dienkapsulasi dalam subroutine privat.

Untuk mengonfigurasi contoh Tugas Skrip ini untuk digunakan dengan satu file gambar

  1. Buat variabel string bernama CurrentImageFile dan atur nilainya ke jalur dan nama file file dari file gambar yang ada.

  2. Buat juga variabel bilangan MaxThumbSize bulat dan tetapkan nilai dalam piksel, seperti 100.

  3. Pada halaman SkripEditor Tugas Skrip, tambahkan kedua variabel ke properti ReadOnlyVariables .

  4. Dalam proyek skrip, atur referensi ke namespace layanan System.Drawing .

  5. Dalam kode Anda, gunakan pernyataan Impor untuk mengimpor namespace System.Drawing dan System.IO .

Untuk mengonfigurasi contoh Tugas Skrip ini untuk digunakan dengan beberapa file gambar

  1. Tempatkan tugas Skrip dalam kontainer Foreach Loop.

  2. Pada halaman KoleksiEditor Perulangan Foreach, pilih Enumerator File Foreach sebagai Enumerator, dan tentukan jalur dan masker file dari file sumber, seperti "*.jpg."

  3. Pada halaman Pemetaan Variabel , petakan variabel ke CurrentImageFile Indeks 0. Variabel ini meneruskan nama file saat ini ke tugas Skrip pada setiap iterasi enumerator.

    Catatan

    Langkah-langkah ini selain langkah-langkah yang tercantum dalam prosedur untuk digunakan dengan satu file gambar.

Contoh 2 Kode

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);  
  
            }  
  
        }