ID Artikel: 81498 - Kajian Terakhir: 14 September 2011 - Revisi: 2.0

DIBs dan menggunakan mereka

Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.

Pada Halaman ini

Perbesar semua | Perkecil semua

RINGKASAN

Berikut ini adalah teks dari artikel "DIBs dan mereka menggunakan". Ini Artikel ini tersedia dalam format file Bantuan Windows di perangkat lunak Microsoft Perpustakaan selain untuk teks yang disajikan di bawah ini.

INFORMASI LEBIH LANJUT

Berkas berikut ini tersedia untuk di-download dari Microsoft Pusat Download:


Dibs2.exe (http://download.microsoft.com/download/platformsdk/article/3.1/W31/EN-US/Dibs2.exe)
Untuk informasi lebih lanjut tentang cara men-download berkas Dukungan Microsoft, klik nomor artikel di bawah ini untuk melihat artikel pada Basis Pengetahuan Microsoft:
119591  (http://support.microsoft.com/kb/119591/EN-US/ ) Cara mendapatkan berkas Dukungan Microsoft dari Layanan Online
Microsoft telah memindai berkas ini dari virus. Microsoft menggunakan perangkat lunak pendeteksi virus terbaru yang tersedia pada tanggal saat berkas dikirimkan. Berkas tersebut disimpan di server yang aman, yang membantu mencegah pengubahan yang tidak sah terhadap berkas.Artikel ini membahas konsep DIB (bitmap perangkat-independen) dari Definisi dan struktur untuk API yang menggunakannya. Termasuk adalah kecil contoh aplikasi yang menggambarkan beberapa metode yang paling umum dari menggunakan DIBs untuk menampilkan dan memanipulasi gambar digital. Fungsi yang dibahas adalah GetDIBits(), SetDIBits(), CreateDIBitmap(), SetDIBitsToDevice(), StretchDIBits(), dan CreateDIBPatternBrush(). Artikel ini tidak membahas menggunakan palet dengan DIBs.

SEKILAS PANDANG

Bitmap perangkat-independen (DIB) adalah format yang digunakan untuk menentukan perangkat- bitmaps independen dalam berbagai warna resolusi. Tujuan utama dari DIBs adalah untuk memungkinkan bitmaps dipindahkan dari satu perangkat lain (oleh karena itu, perangkat-independen bagian dari nama). DIB adalah format eksternal, di kontras dengan suatu bitmap tergantung perangkat, yang muncul dalam sistem sebagai bitmap objek (dibuat dengan menggunakan aplikasi CreateBitmap(),CreateCompatibleBitmap(), CreateBitmapIndirect(), atau CreateDIBitmap()). DIB biasanya diangkut dalam metafiles (biasanya menggunakan StretchDIBits() fungsi), BMP file, dan Clipboard (CF_DIB data format).

DIB terdiri dari dua bagian: bit sendiri dan sebuah header yang menjelaskan format bit. Header berisi format warna, Tabel warna, dan ukuran bitmap. Mendukung format DIB saat ini empat warna resolusi: 1 bit, 4 bit, 8 bit, dan 24 bit. Di 1-bit, 4-bit, dan 8-bit DIBs, pixel ditetapkan oleh indeks (dari sedikit sesuai resolusi) ke dalam tabel warna; 24-bit piksel digambarkan sebagai 24-bit nilai-nilai, 1 byte masing-masing untuk merah, hijau, dan biru. Fungsi DIB adalah:
   GetDIBits:           Translates a device-dependent bitmap into the DIB
                        format

   SetDIBits:           Translates a DIB's information into device-
                        dependent form

   CreateDIBitmap:      Creates a device-dependent bitmap initialized with
                        DIB information

   SetDIBitsToDevice:   Sets a DIB directly to the output surface

   StretchDIBits:       Moves a rectangle from the DIB to a rectangle on
                        the destination surface, stretching or compressing
                        as necessary

   CreateDIBPatternBrush:   Creates a pattern brush using a DIB for the
                            bitmap description
				

PERANGKAT KEMERDEKAAN - APAKAH ITU BAIK UNTUK?

Mentransfer bitmaps warna dari satu perangkat yang lain itu tidak mungkin di Versi Microsoft Windows lingkungan grafis lebih awal dari 3.0. Dengan DIBs, masing-masing perangkat menampilkan gambar sampai warna resolusi. Aplikasi dapat menyimpan gambar dalam DIB format dan kemudian menampilkan, terlepas dari perangkat output; kebutuhan aplikasi yang tidak lagi membuat versi dari setiap gambar untuk setiap jenis perangkat.

Kemampuan mentransfer gambar ini dapat digunakan untuk mencetak gambar halftone. Untuk contoh, StretchDIBits() fungsi dapat melewati DIB langsung ke pengandar printer yang cerdas. Diberikan informasi penuh warna gambar Alih-alih hanya monokrom versi (metode tradisional), driver dapat menggunakan warna halftone untuk mencetak gambar realistis.

Karena DIB format umum didefinisikan, aplikasi dapat memanipulasi ini dengan cepat. Pada kenyataannya, aplikasi dapat membangun gambar tanpa interaksi dengan Windows. Jika Windows tidak memiliki gambar primitif, aplikasi dapat mensimulasikan langsung ke DIB alih-alih menggunakan ada graphics device interface (GDI) primitif. Sayangnya, di bawah Windows versi 3.0 dan 3.1, GDI tidak dapat melakukan operasi output langsung untuk DIB.

FORMAT FILE BMP

Ekstensi file dari file Windows DIB adalah BMP. File terdiri dariBITMAPFILEHEADER struktur diikuti oleh DIB itu sendiri. Sayangnya, karena BITMAPFILEHEADER struktur pernah benar-benar dilewatkan ke API, tidak setiap aplikasi yang menghasilkan file BMP mengisi struktur data dengan hati-hati. Untuk menambah kebingungan ini, definisi "tepat" struktur adalah bertentangan dengan dokumentasi. Benar, struktur data berisi bidang-bidang berikut:
   bfType              A WORD that defines the type of file. It must be
                       'BM'.

   bfSize              A DWORD that specifies the size of the file in
                       bytes. The Microsoft Windows Software Development
                       Kit (SDK) documentation claims otherwise. To be on
                       the safe side, many applications calculate their
                       own sizes for reading in a file.

   bfReserved1,
   bfReserved2         WORDs that must be set to 0.

   bfOffBits           A DWORD that specifies the offset from the

                       beginning of the BITMAPFILEHEADER structure to the
                       start of the actual bits. The DIB header
                       immediately follows the file header, but the
                       actual image bits need not be placed next to the
                       headers in the file.
				
DIB header segera mengikuti BITMAPFILEHEADER struktur.

Untuk contoh kode yang membaca BMP file, lihat contoh program.

DIB Header

Header benar-benar terdiri dari dua bagian sebelah: header yang tepat dan Tabel warna. Keduanya digabungkan dalam BITMAPINFO struktur, yang adalah apa yang semua DIB api harapkan.

Windows versi 3.0 mendukung dua jenis header: BITMAPINFOHEADER dan BITMAPCOREHEADER. Jika mungkin, aplikasi harus menggunakan hanya BITMAPINFOHEADERs. Definisi BITMAPCOREHEADER berdasarkan bitmap definisi dari presentasi Manager versi 1.1 dan didukung untuk kompatibilitas.

Selama operasi pengaturan DIB, sebagian besar bidang yang sudah diisi oleh siapa pun dihasilkan DIB. Melakukan GetDIBits() panggilan, namun, memberikan kontrol yang lebih besar. Cara header diisi untuk operasi ini mendefinisikan DIB dihasilkan, terutama dengan resolusi warna.

BITMAPINFOHEADER berisi bidang-bidang berikut:
   biSize              Should be set to sizeof(BITMAPINFOHEADER). This
                       field defines the size of the header (minus the
                       color table). If a new DIB definition is added, it
                       is identified by a new value for the size. This
                       field is also convenient for calculating a pointer
                       to the color table, which immediately follows the
                       BITMAPINFOHEADER.

   biWidth, biHeight   Define the width and the height of the bitmap in
                       pixels. They are DWORD values for future
                       expansion, and the code in Windows versions 3.0
                       and 3.1 ignores the high word (which should be set
                       to 0).

   biPlanes            Should always be 1. All DIB definitions rely on
                       biBitCount for color resolution definition.

   biBitCount          Defines the color resolution (in bits per pixel)
                       of the DIB. Only four values are valid for this
                       field: 1, 4, 8, and 24. New resolutions (16 bit,
                       for example) may be added in the future, but for
                       now only these four define a valid DIB. Choosing the
                       appropriate value when doing a GetDIBits is
                       discussed below. When performing a Set operation,
                       the value should already be defined for the bits.

   biCompression       Specifies the type of compression. Can be one of
                       three values: BI_RGB, BI_RLE4, or BI_RLE8. The most
                       common and useful choice, BI_RGB, defines a DIB in
                       which all is as it seems. Each block of biBitCount
                       bits defines an index (or RGB value for 24-bit
                       versions) into the color table. The other two
                       options specify that the DIB is stored (or will be
                       stored) using either the 4-bit or the 8-bit run
                       length encoding (RLE) scheme that Windows
                       supports. The RLE formats are especially useful
                       for animation applications and also usually
                       compress the bitmap. BI_RGB format is recommended
                       for almost all purposes. RLE versions, although
                       possibly smaller, are slower to decode, not as
                       widely supported, and extremely painful to band
                       properly.

   biSizeImage         Should contain the size of the bitmap proper in
                       bytes. I say "should" because the field is not
                       necessarily filled in. A call to GetDIBits to
                       generate a DIB fills in this field, but a DIB
                       created manually by an application might not have
                       this filled in. Calculating the size of a bitmap
                       is not hard:

                       biSizeImage = ((((biWidth * biBitCount) + 31)
                                      & ~31) >> 3) * biHeight;

                       The crazy roundoffs and shifts account for the
                       bitmap being DWORD-aligned at the end of every
                       scanline. When nonzero, this field tells an
                       application how much storage space the DIB's bits
                       need. The biSizeImage field really becomes useful
                       when dealing with an RLE bitmap, the size of which
                       depends on how well the bitmap was encoded. If an
                       RLE bitmap is to be passed around, the biSizeImage
                       field is essential.

   biXPelsPerMeter,
   biYPelsPerMeter     Define application-specified values for the
                       desirable dimensions of the bitmap. This
                       information can be used to maintain the physical
                       dimensions of an image across devices of different
                       resolutions. GDI never touches these fields. When
                       not filled in, they should both be set to 0.

   biClrUsed           Provides a way for getting smaller color tables.
                       When this field is set to 0, the number of colors
                       in the color table is based on the biBitCount
                       field (1 indicates 2 colors, 4 indicates 16, 8
                       indicates 256, and 24 indicates no color table). A
                       nonzero value specifies the exact number of colors
                       in the table. So, for example, if an 8-bit DIB
                       uses only 17 colors, then only those 17 colors
                       need to be defined in the table, and biClrUsed is
                       set to 17. Of course, no pixel can have an index
                       pointing past the end of the table.

                       Note: This field cannot be used during a GetDIBits
                       operation. GDI always fills a full-size color
                       table. The field is therefore more useful for
                       post-processing operations, when an application
                       trims down the contents of the DIB. If nonzero for
                       a 24-bit DIB, it indicates a table that the
                       application can use for color reference.

   biClrImportant      Specifies that the first x colors of the color
                       table are important to the DIB. If the rest of the
                       colors are not available, the image still retains
                       its meaning in an acceptable manner.
                       biClrImportant is purely for application use; GDI
                       does not touch this value. When this field is set
                       to 0, all the colors are important, or rather,
                       their relative importance has not been computed.
				
Tabel warna segera mengikuti informasi header. Tabel warna tidak didefinisikan untuk 24-bit DIBs. Tabel terdiri dari sebuah array data RGBQUAD struktur. (Tabel untuk BITMAPCOREINFO format dibangun denganRGBTRIPLE struktur data.) Merah, hijau, dan biru byte berada dalam urutan terbalik (merah swap posisi dengan biru) dari Konvensi Windows. Ini adalah sisa lain dari presentasi manajer kompatibilitas.

Ukuran tabel warna tergantung pada nilai biBitCount (dan dapat menjadi overwritten menggunakan biClrUsed bidang ini. Lihat di atas):
   if (!(nNumColors = biClrUsed))
   {

     if (biBitCount != 24)
          nNumColors = 1 << biBitCount;

   }
   nTableSize = nNumColors * sizeof(RGBQUAD);
				
Kebanyakan DIBs beredar saat ini memiliki biClrUsed diset ke 0, tetapi jika ada penuh DIB bashing direncanakan, itu adalah ide yang baik untuk mengatur dengan benar. Jika biClrUsed bukan nol, tabel warna dengan 24-bit DIBs mungkin. GDI Apakah tidak menggunakan tabel warna ini, tapi aplikasi dapat menggunakannya untuk menentukan warna penting yang digunakan dalam DIB.

Semua fungsi DIB termasuk parameter wUsage, yang dapat mempengaruhi definisi dari tabel warna. Artikel ini menghindari menggunakan palet dengan DIBs, dan dengan demikian menganggap bahwa wUsage selalu diatur ke DIB_RGB_COLORS dan bahwa tabel warna karena itu selalu terdiri dari nilai-nilai RGB. Kapan DIB_PAL_COLORS digunakan, tabel warna terdiri dari nilai-nilai kata yang Indeks ke palet logis yang saat ini dipilih. (Ini adalah topik dibahas secara rinci dalam artikel "Menggunakan DIBs dengan palet".)

Bit format

Header mendefinisikan format bit, tapi semua format berbagi aturan berikut:
  • Scanline setiap selaras DWORD. Scanline buffered untuk kesejajaran; buffering adalah tidak selalu 0.
  • Scanlines disimpan terbalik, dengan pertama pemindaian (scan 0) dalam memori menjadi scan bilet dalam gambar. (Lihat gambar 1). Ini adalah artifak lain presentasi manajer kompatibilitas. GDI secara otomatis masuk gambar selama Set dan mendapatkan operasi. Gambar 1. (Gambar tertanam menunjukkan representasi memori dan layar.)
  • Batas-batas segmen 64 K tidak dihormati; scanlines bisa menyeberang seperti batas-batas (tidak seperti format bitmap tergantung perangkat yang buffered untuk batas-batas 64 K).
Setiap format memiliki spesifikasi berikut:
  • 1-bit DIBs disimpan menggunakan setiap bit sebagai indeks ke warna tabel. Bit paling signifikan adalah pixel paling kiri.
4-bit DIBs disimpan dengan masing-masing 4 bit mewakili indeks ke tabel warna. Menggigit paling signifikan adalah pixel paling kiri.
  • 8-bit DIBs adalah yang termudah untuk menyimpan karena setiap byte adalah indeks.
  • 24-bit DIBs memiliki setiap byte 3 yang mewakili warna, menggunakan sama memesan sebagai tabel warna. Format ini terutama sulit selama pemrosesan karena batas 64 K dapat ada di tiga warna--kondisi yang sulit yang harus ditangani dengan hati-hati.

MENGGUNAKAN DIB API

GetDIBits() dan SetDIBits()

Dua fungsi ini digunakan untuk mengkonversi perangkat-independen bitmaps ke tergantung perangkat bitmaps dan sebaliknya. SetDIBits() mengkonversi DIB ke suatu bitmap tergantung perangkat, dan GetDIBits() menghasilkan DIB dari suatu bitmap tergantung perangkat.

Pengandar perangkat yang direferensikan oleh hDC yang dilewatkan ke dalam panggilan kedua melakukan terjemahan sebenarnya. Beberapa pengandar perangkat mungkin tidak memiliki fungsi ini (misalnya, Windows versi 2.0 driver atau versi Windows primitif 3,0 sopir). Dalam kasus ini, GDI mensimulasikan terjemahan, tetapi hanya dalam monokrom--warna informasi menjadi hitam dan putih. Untuk sebagian besar, namun, hal ini tidak menjadi perhatian. Semua self-respecting layar driver mendukung fungsi ini, dan tidak hanya beberapa driver printer menyediakan terjemahan, biasanya monokrom driver yang GDI simulasi cukup.

GetDeviceCaps (hDC, RASTERCAPS) mengembalikan nilai kata dengan bendera set menunjukkan DIB yang berfungsi mendukung pengandar. RC_DI_BITMAP menunjukkan dukungan GetDIBits() dan SetDIBits()RC_DIBTODEV menunjukkan dukungan SetDIBitsToDevice(), dan RC_STRETCHDIB menunjukkan dukungan StretchDIBits(). Fungsi yang tidak didukung dapat disimulasikan, meskipun simulasi sering tidak berguna sebagai hal yang nyata (terutama karena warna informasi hilang). Perangkat mungkin tidak dapat mendukung fungsionalitas penuh bahkan jika sedikit diatur. Sebagai contoh, perangkat dapat mendukung StretchDIBits tapi hanya untuk integral peregangan. Sayangnya, aplikasi tidak memiliki cara untuk menentukan kelengkapan pelaksanaan. Dalam kasus ini, GDI mensimulasikan fungsi.

Parameter yang sama untuk kedua GetDIBits() dan SetDIBits():
GetDIBits(hDC, hBitmap, nStartScan, nNumScans, lpBits, lpBitmapInfo,
wUsage)

SetDIBits(hDC, hBitmap, nStartScan, nNumScans, lpBits, lpBitmapInfo,
wUsage)

hDC            The device context (DC) responsible for the translation
               operation. hDC must be compatible with the hBitmap
               parameter.

hBitmap        The device-dependent bitmap from which (Get) or to
               which (Set) the DIB will be translated. Because of how
               the simulation code operates, this bitmap should not be
               currently selected into any DC.

nStartScan,
nNumScans      Define the contents of lpBits. For example, a StartScan
               of 5 indicates that lpBits points to the fifth scan of
               the DIB. A NumScans of 14 indicates that lpBits points
               to 14 scans of the DIB. Normally, nStartScan is set to
               0 and nNumScans is set to biHeight to denote that the
               whole DIB is pointed to by lpBits.

lpBits         The actual bitmap of the DIB. The pixel information is
               pointed to by this parameter.

lpBitmapInfo   The header (with color table) defining the DIB. The
               height and width in this header must match the height
               and width of the hBitmap parameter (the translation is
               always 1-to-1). The color resolution of the DIB need
               not match that of hBitmap.

wUsage         For the purposes of this article, assume this to be
               DIB_RGB_COLORS, indicating RGB colors in the color
               table.
				
Menggunakan SetDIBits() ini cukup sederhana. DIB diambil dari di suatu tempat (misalnya, dari Clipboard atau dari disk file) dan dikonversi ke objek bitmap, yang kemudian dapat dipilih ke DC dan blted ke layar untuk ditampilkan. Ini adalah cara paling sederhana untuk menampilkan DIB.

Catatan Untuk banyak printer yang bisa melakukan warna halftone, metode ini adalah tidak pilihan; StretchDIBits (dibahas berikut) jauh lebih berguna.

Berikut adalah tampilan sederhana DIB ke DC (dengan tidak ada kesalahan penanganan):
   HBITMAP hBitmap;
   HDC hMemDC;

   hBitmap = CreateCompatibleBitmap(hDC, (WORD)lpInfo->biWidth,
          lpInfo->(WORD)biHeight);

   hMemDC = CreateCompatibleDC(hDC);
   SetDIBits(hDC, hBitmap, 0, (WORD)lpInfo->biHeight, lpBits,

          lpBitmapInfo, DIB_RGB_COLORS);

   hBitmap = SelectObject(hMemDC, hBitmap);
   BitBlt(hDC, 0, 0, (WORD)lpInfo->biWidth, (WORD)lpInfo->biHeight,

          hMemDC, 0, 0, SRCCOPY);

   DeleteObject(SelectObject(hMemDC, hBitmap));
   DeleteDC(hMemDC);
				
Menggunakan GetDIBits() lebih kompleks karena aplikasi dapat memilih apa jenis DIB untuk menghasilkan. Mengatur ukuran bitmap sumber DIB dimensi (sepotong dapat diambil oleh blting ke lebih kecil bitmap), tapi aplikasi perlu dapat menentukan warna resolusi.

Untuk GetDIBits() untuk bekerja dengan baik, aplikasi ini perlu untuk menetapkan bidang berikut di header:
   biSize = sizeof(BITMAPINFOHEADER)
   biWidth = (width of the bitmap)
   biHeight = (height of the bitmap)
   biPlanes = 1
   biBitCount = [desired color resolution (1, 4, 8, or 24)]
   biCompression = BI_RGB (For RLE information, see below.)
				
Juga, ruang yang dialokasikan untuk tabel warna harus cukup untuk memegang meja ukuran penuh:
   if (biBitCount != 24)

     nSizeTable = (1 << biBitCount) * sizeof(RGBQUAD)

   else

     nSizeTable = 0;
				
Ruang yang dialokasikan untuk lpBits juga harus cukup besar untuk menampung nNumScans data. Panggilan mengisi kolom berikut struktur:
  • biSizeImage = ukuran dalam bytes of DIB data
  • Tabel warna (untuk kasus non-24-bit) diisi dengan warna yang sesuai
  • lpBits diisi dengan DIB data
Jika GetDIBits() disebut dengan lpBits diatur ke NULL, tidak kembali; hanya biSizeImage dan tabel warna diisi. Opsi ini berguna untuk DIBs dengan DIB dan tidak berguna untuk non-dikodekan DIBs.

Aplikasi tujuan untuk DIB menentukan apa resolusi warna untuk memilih. Pendekatan yang biasa adalah untuk menghasilkan DIB yang melindungi warna informasi dari sumber tergantung perangkat bitmap. Memilih resolusi yang lebih rendah mengakibatkan hilangnya informasi warna, yang biasanya tidak diinginkan. Selalu menggunakan 24-bit resolusi tidak perlu, Namun, karena melakukannya menambahkan warna resolusi tidak lebih jika sumber memiliki resolusi 8-bit atau kurang.
   BITMAP bm;

   // get information on bitmap
   GetObject(hBitmap, sizeof(BITMAP), (LPVOID)&bm);

   BitmapRes = bm.bmPlanes * bm.bmBitsPixel;
   if (BitmapRes == 1)

     biBitCount = 1;

   else if (BitmapRes <= 4)

     biBitCount = 4;

   else if (BitmapRes <= 8)

     biBitCount = 8;

   else

     biBitCount = 24;
				
Bitmap resolusi perhitungan harus memperhitungkan bahwa beberapa tergantung perangkat bitmaps planar (terutama EGA dan VGA). DIBs, sisi lain, selalu "dikemas piksel," dengan hanya 1 pesawat per piksel (pesawat sayap ganda = 1).

Parameter nStartScan dan nNumScans (residu presentasi Manajer kompatibilitas) dirancang untuk digunakan untuk banding. Jika tidak cukup memori tersedia untuk memuat seluruh DIB ke memori di salah satu sepotong, lpBits dapat dibuat untuk menunjuk ke hanya sebagian bit. Perhatikan contoh berikut:
   #define MAXREAD 5
   WORD ReadXScans(LPSTR, WORD);   // Read up to X scans; return
                                   // NumRead.
   LPSTR lpBits;                   // Points to a block of memory for
                                   // MAXREAD scans.
   LPBITMAPINFOHEADER lpInfo;
   WORD nStart, nNumRead;

   for (nStart = 0; nStart >= (WORD)lpInfo->biHeight; )
   {

     nNumRead = ReadXScans(lpBits, MAXREAD);
     SetDIBits(hDC, hBitmap, nStart, nNumRead,
          lpBits, lpInfo, DIB_RGB_COLORS);
     nStart += nNumRead;

   }
				
Kode Set mengambil band tertentu, menerjemahkan itu, dan menempatkan band diterjemahkan di lokasi yang tepat, akuntansi di semua kali sifat terbalik DIBs. Perhatikan bagaimana biHeight tidak perubahan pada setiap saat karena band ditempatkan di bitmap berdasarkan ketinggian dari bitmap penuh. nStart didasarkan pada ketinggian penuh gambar (didefinisikan oleh biHeight).

CreateDIBitmap()

Kode berikut menunjukkan panggilan CreateDIBitmap() dengan biasa kasus:
   hBitmap = CreateDIBitmap(hDC, lpInfo, CBM_INIT, lpBits, lpInfo,
                            wUsage);
				
Ini setara dengan:
   hBitmap = CreateCompatibleBitmap(hDC, (WORD)lpInfo->biWidth,

             (WORD)lpInfo->biHeight);

   SetDIBits(hDC, hBitmap, 0, (WORD)lpInfo->biHeight, lpBits, lpInfo,
             wUsage);
				
Pelaksanaan GDI's melompat SetDIBits() bagian Jika parameter ketiga tidak diatur dengan bendera CBM_INIT. Fungsi ini untuk membuat baik Pintasan pengkodean konversi dari DIB ke bitmap tergantung perangkat.

SetDIBitsToDevice()

SetDIBitsToDevice() memungkinkan aplikasi untuk mengatur DIB langsung ke permukaan perangkat. Karena fungsi ini merupakan ketidaksepakatan dari awal pengembangan, antarmuka bukanlah sebagai dipoles seperti itu bisa. StretchDIBits() fungsi jauh lebih kuat daripada SetDIBitsToDevice(). StretchDIBits() tidak semua ituSetDIBitsToDevice() Apakah dan memiliki antarmuka yang lebih baik. SetDIBitsToDevice() terbatas dalam cara menangani metafiles karena tidak skala, dan banding dengan parameter nStartScan dan nNumScans nontrivial di terbaik. StretchDIBits() tidak membiarkan banding.

Kode berikut melakukan SetDIBitsToDevice() fungsi pada bitmap penuh (tidak ada banding) menggunakan StretchDIBits:
   StretchDIBits(hDC, x, y, (WORD)lpInfo->biWidth,

          (WORD)lpInfo->biHeight, 0, 0, (WORD)lpInfo->biWidth,
          (WORD)lpInfo->biHeight, lpBits, lpInfo, DIB_RGB_COLORS,
          SRCCOPY)
				
Dengan asumsi bahwa nStartScan diatur ke 0 dan nNumScans itu diatur ke lpInfo-> biHeight (yaitu tidak ada banding), fungsi pada dasarnya adalah BitBlt dengan SRCCOPY sebagai ROP dan DIB sebagai sumber. SrcX dan SrcY berada di DIB ruang dan oleh karena itu terbalik dalam kaitannya untuk DC (Y = 0 adalah di bawah gambar).

Berurusan dengan upside-down DIB rumit ketika melakukan parsial pengaturan. Sebagai contoh, jika aplikasi ingin mendapatkan bagian ketiga dari DIB w oleh h piksel untuk perangkat di (x, y), panggilan akan seperti berikut:
   SetDIBitsToDevice(hDC, x, y, w, h/3, 0, h/3, 0,

          (WORD)lpInfo->biHeight, lpBits, lpInfo, DIB_RGB_COLORS);
				
Suatu bitmap tergantung perangkat akan memiliki SrcY 2 h/3 untuk bagian bawah ketiga, tetapi dengan sistem terbalik DIB, SrcY h/3 menunjuk ke tempat yang tepat relatif terhadap Windows koordinat.

StretchDIBits()

Fungsi ini adalah semua dilakukan sayang untuk menampilkan DIB pada permukaan perangkat. Hal ini sangat baik untuk metafiling dan Percetakan, kemampuan untuk meregangkan yang penting.

Satu lubang kritis dalam pelaksanaan saat ini StretchDIBits() adalah bahwa StretchDIBits() didukung oleh driver printer dan tidak banyak Tampilkan pengandar. Oleh karena itu, menggunakan fungsi ini berulang kali untuk meregangkan DIB ke layar secara signifikan lebih lambat daripada menggunakan SetDIBits (untuk mendapatkan suatu bitmap tergantung perangkat) diikuti oleh diulang StretchBlt() panggilan.

Pelaksanaan fungsi ini dalam GDI ini sangat sederhana. Jika pengandar perangkat dapat menangani panggilan itu sendiri, itu tidak. Jika tidak, dan panggilan adalah 1-1 dan perangkat mendukung SetDIBitsToDevice(), panggilan masuk SetDIBitsToDevice() memanggil sopir. (Ini hanya bekerja dengan SRCCOPY sebagai ROP.) Jika tak satu pun dari metode ini mungkin, CreateDIBitmap() digunakan untuk membuat versi tergantung perangkat bitmap, dan StretchBlt dipanggil untuk melakukan pekerjaan yang sebenarnya.

Parameter untuk StretchDIBits() pada dasarnya adalah sama untukStretchBlt() (dengan sumber hDC digantikan oleh lpBits dan lpInfo). Fungsi ini tidak memiliki nStartScan dan parameter nNumScans DIB fungsi lain, jadi lpBits selalu poin untuk scan pertama DIB.

Ketika menggunakan fungsi ini untuk apa-apa selain penuh bitmap peregangan, ingat bahwa semua sumber koordinat (yang berkaitan dengan DIB) dalam sistem terbalik. Fungsi akan tepat flip gambar, tapi persegi panjang sumber didefinisikan dengan Y = 0 di bawah dan extent naik. Untungnya, koordinat-x menggunakan konvensi sama seperti Windows.

Driver printer yang mendukung fungsi ini (misalnya, PSCRIPT dan HPPCL) biasanya menggunakan algoritma halftone output baik warna gambar. Oleh karena itu, mempertahankan DIBs pada tertinggi bermakna warna resolusi mungkin (biasanya 8 bit) diinginkan bahkan jika perangkat output adalah monokrom, karena informasi warna masih berguna untuk baik output. Sayangnya, sebagian besar driver printer tidak mendukung ROP apapun selain SRCCOPY.

CreateDIBPatternBrush()

Fungsi ini memungkinkan aplikasi untuk menciptakan pola kuas oleh menentukan DIB bukannya suatu bitmap tergantung perangkat, sebagai digunakan dalamCreatePatternBrush() fungsi. Kuas dibuat menggunakan fungsi ini digunakan mirip dengan sikat lain. DIB adalah berubah menjadi bitmap perangkat-tergantung pada SelectObject() waktu untuk digunakan dengan perangkat. Sikat ini menyerupai pola standar kuas untuk perangkat.

DIBS PADA CLIPBOARD

Dua dasar mekanisme untuk menempatkan DIBs di Clipboard menggunakan CF_DIB data format atau menempatkan DIB ke metafile dan menggunakan CF_METAFILEPICT data format.

CF_DIB format menggunakan DIB dikemas, yang mengikuti bit segera setelah header dan tabel warna. Ketika membaca atau menciptakan DIB dikemas, aplikasi harus benar menghitung ukuran Tabel warna untuk memastikan bahwa bit berada di tempat yang tepat. Karena mengharapkan semua fungsi RLE DIB sebagai petunjuk dua, satu untuk header dan satu untuk bit, penunjuk bit harus dihitung sebelum menggunakan. (Untuk perhitungan ukuran tabel warna, lihat kode sampel di warna meja penjelasan di atas.)

Cara termudah untuk menempatkan DIB ke metafile adalah dengan menggunakanStretchDIBits():
   hMetaDC = CreateMetaFile((LPSTR) NULL));
   StretchDIBits(hMetaDC, 0, 0, biWidth, biHeight, 0, 0, biWidth,

          biHeight, lpBits, lpInfo, DIB_RGB_COLORS, SRCCOPY);

   hMetafile = CloseMetaFile(hMF);
				
Pendekatan ini menghasilkan metafile bahwa ketika diputar kembali menampilkan DIB ke tujuan. Metode ini juga skala gambar untuk cocok skema pemetaan saat ini jika diperlukan. Menggunakan metafiles untuk transfer memungkinkan bahkan aplikasi yang tidak DIB-sadar untuk menyisipkan isi Clipboard tanpa kehilangan informasi DIB.

DIB FORMAT

Ketika biCompression lapangan di header DIB diatur ke BI_RLE4 baik (untuk biBitCount = 4) atau BI_RLE8 (untuk biBitCount = 8), gambar telah jangka panjang dikodekan. Penjelasan dari skema pengkodean dapat ditemukan di "Microsoft Windows Software Development Kit referensi Volume 2," di "BITMAPINFOHEADER" bagian "tipe Data dan struktur" Bab. The skema dasar melibatkan mengompresi beberapa, horizontal berdekatan, identik piksel ke menjalankan encoding. Sebagai contoh, 10 piksel warna indeks 17 dikodekan sebagai jangka panjang 10 dan indeks 17. Kode untuk akhir scan dan untuk delta bergerak juga disediakan, di mana x dan y offset adalah disediakan untuk pixel berikutnya.

Jenis penyandian biasanya memampatkan bitmap dan juga berguna untuk membuat animasi sprite-jenis, yang hanya sebagian kecil dari gambar perubahan di setiap bingkai. Kemampuan animasi dicapai dengan menggunakan Delta kode untuk membatasi jumlah piksel sebenarnya sedang diatur. Piksel dilewati oleh delta bergerak kiri tersentuh.

Keterbatasan utama DIB DIBs adalah bahwa aplikasi dapat tidak mudah menentukan ukuran bitmap dalam bytes juga menunjuk ke scanline tertentu tanpa decoding bitmap dari scan pertama. Medan biSizeImage berguna dalam pemecahan masalah pertama. Decoding, encoding, dan umumnya memanipulasi format DIB lebih lambat dan lebih rumit daripada noncompressed (BI_RGB) format. Beberapa aplikasi - misalnya, kuas --menolak untuk membaca DIB DIBs. Meskipun semua api menerima mereka, DIB DIBs akan mungkin tidak menjadi format yang didukung secara universal. Juga, karena dari relatif jarang format ini, beberapa driver mungkin tidak sepenuhnya diuji dukungan untuk proses encoding dan decoding.

Untuk menghasilkan RLE DIB, GetDIBits() disebut dengan biCompression set ke jenis yang diinginkan encoding. Jumlah memori yang dibutuhkan untuk menyimpan potongan-potongan tidak dihitung dengan mudah. Jika GetDIBits() disebut dengan lpBits diatur ke NULL, jumlah memori yang dibutuhkan untuk bit kembali di biSizeImage. Panggilan berikutnya dengan lpBits menunjuk ke blok benar ukuran memori kembali bitmap dikodekan.

Menerjemahkan RLE DIB ke bentuk tergantung perangkat memerlukan no Pengolahan khusus. Salah satu fungsi Set dapat digunakan biasanya dengan header yang berisi nilai biSizeImage dan biCompression yang tepat untuk cocok bit.

KEKURANGAN DIBS

Mungkin pembatasan terbesar DIBs adalah bahwa mereka lebih lambat daripada bitmaps tergantung perangkat. Menerjemahkan DIBs ke bentuk tergantung perangkat sebelum mereka dapat benar-benar ditampilkan memerlukan kemampuan pemrosesan yang mengakibatkan tambahan. Dalam dunia ideal, StretchDIBits() 1-1 akan secepat BitBlt(). Kecepatan ini akan memungkinkan aplikasi untuk beroperasi secara efektif dalam bidang bitmap logis, yang penuh warna dan akses penuh ke setiap pixel, terlepas dari perangkat fisik keterbatasan.

DIBs didasarkan pada sistem koordinat yang terbalik relatif terhadap Windows, membuat kode sedikit frustrasi dan tidak intuitif. Selalu Mengingat quirkiness ini harus membantu membatasi jumlah iterasi diperlukan untuk mendapatkan bitmaps benar berbaris.

Anda bisa mendapatkan warna penuh menggunakan 24-bit DIBs, tetapi mereka sangat lambat untuk memecahkan sandi, membaca, dan menulis. Hal ini terutama berlaku pada palet 8-bit perangkat, di mana terjemahan harfiah dapat mengambil menit. Juga, ukuran 24-bit DIBs membuat mereka sedikit berat untuk penggunaan umum.

MASALAH YANG BERKAITAN DENGAN DIB DI WINDOWS VERSI 3.0

Rekaman metafile StretchDIBits() panggilan yang menggunakan BITMAPCOREHEADER menyebabkan UEA. Mengkonversi semua header untuk gaya BITMAPINFO untuk menghindari masalah ini. Pemecahan masalah ini dianjurkan untuk umum DIB pengolahan.

The SetDIBits() simulasi kode untuk lebih besar daripada 64 K monokrom DIBs menyebabkan crash atau cetakan salah ketika menggunakan SetDIBits(), aSetDIBitsToDevice(), atau StretchDIBits() untuk pengandar yang tidak mendukung SetDIBits().

Hak cipta 1992 oleh Microsoft Corporation. Semua hak dilindungi undang-undang.

Berlaku bagi:
  • Microsoft Windows Software Development Kit 3.1
Kata kunci: 
kbdownload kb16bitonly kbfile kbinfo kbsample kbmt KB81498 KbMtid
Penerjemahan MesinPenerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:81498  (http://support.microsoft.com/kb/81498/en-us/ )
Retired KB ArticleSanggahan Konten KB yang Tidak Lagi Diperbarui
Artikel ini berisi tentang produk yang tidak lagi didukung oleh Microsoft. Oleh karena itu, artikel ini disajikan ?sebagaimana adanya? dan tidak akan diperbarui.