Makale numarası: 81498 - Son Gözden Geçirme: 11 Şubat 2005 Cuma - Gözden geçirme: 2.5

DIBs ve kendi kullanır

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

Aşağıdaki makalenin "Dıb'leri ve Their kullanan" metindir. Bu makalede, Windows Yardım dosyası biçiminde aşağıda gösterilen metin yanında Microsoft yazılım kitaplığı için kullanılabilir.

Daha fazla bilgi

Aşağıdaki dosyalar Microsoft Yükleme Merkezi'nden yüklenebilir:


Dibs2.exe (http://download.microsoft.com/download/platformsdk/article/3.1/w31/en-us/dibs2.exe)
Microsoft destek dosyalarını karşıdan yükleme konusunda ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
119591  (http://support.microsoft.com/kb/119591/EN-US/ ) Microsoft Destek Dosyaları Çevrimiçi Hizmetler'den Nasıl Alınır
Microsoft bu dosyada virüs taraması yapmıştır. Microsoft, dosyanın kullanıma sunulduğu tarihteki en güncel virüs tarama yazılımını kullanmıştır. Dosya, üzerinde herhangi bir yetkisiz değişiklik yapılmasını engellemeye yardım eden geliştirilmiş güvenliğe sahip sunucularda depolanır. Bu makalede tanımlama ve yapı DIB (aygıt bağımsız bit eşlem) kavramı kullandığı apı anlatılır. Bulunan dijital resimleri görüntülemek ve Dıb'leri kullanmanın en yaygın yöntemlerden bazılarını gösteren bir küçük bir örnek uygulamasıdır. Açıklanan GetDIBits()SetDIBits(), CreateDIBitmap(), SetDIBitsToDevice(), StretchDIBits() ve CreateDIBPatternBrush() işlevlerdir. Paletleri Dıb'leri ile kullanarak bu makalede anlatılmamaktadır.

GENEL BAKIŞ

Aygıttan bağımsız bit eşlem (DIB) aygıttan bağımsız bit eşlemleri çeşitli renk çözünürlükte tanımlamak için kullanılan bir biçimidir. Dıb'leri ana amacı, bir aygıttan diğerine taşınması bit eşlemleri sağlamaktır (dolayısıyla, aygıttan bağımsız adının bir parçası). Bir DIB bir dış görünür (CreateBitmap(), CreateCompatibleBitmap(), CreateBitmapIndirect() veya CreateDIBitmap() kullanarak bir uygulama tarafından oluşturulan) bir bit eşlem nesnesi sistemdeki bir aygıta bağımlı bit eşlem için tersine biçimdir. Bir DIB meta dosyaları (genellikle StretchDIBits() işlevini kullanarak), BMP dosyaları ve Pano (CF_DIB veri biçimi) normal olarak aktarıldıkları.

Bir DIB iki kısımdan oluşur: bit kendileri ve bitlerin biçimini tanımlayan bir üstbilgi. Üstbilgi, renk biçimi, bir renk tablosu ve bit eşlem boyutunu içerir. Geçerli DIB biçiminde, dört renk çözünürlüğü destekler: 1 bit 4 bit, 8 bit ve 24 bit. 8-Bit 1-bit ve 4-bit Dıb'leri, piksellerin renk tabloya uygun biti çözümlemesi), (dizinler tarafından tanımlanır; 24-bit piksel 24 bitlik değerler, 1 bayt her kırmızı, yeşil ve mavi olarak açıklanmıştır. DIB işlevler şunlardır:
   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
				

AYGIT BAĞIMSIZLIĞI - BU NEDİR İÇİN İYİ?

Renkli bit eşlemler bir aygıttan diğerine aktarılmasını 3. 0 ' Microsoft Windows grafik ortamını önceki sürümlerinde mümkün olmadı. Dıb'leri ile her aygıt, görüntü için renk çözünürlüğü kapsamını görüntüler. Uygulama görüntü DIB) biçiminde depolar ve sonra da, çıktı aygıtından bağımsız olarak görüntülemek, uygulama artık oluşturmak her bir görüntü aygıtı her tür için genel bir sürümü.

Bu görüntü aktarma yeteneği, noktalı resim görüntüleri yazdırmak için kullanılabilir. Örneğin, StretchDIBits() işlev, doğrudan bir akıllı bir yazıcı sürücüsü bir DIB iletebilirsiniz. Resmin yerine, yalnızca tek renkli bir sürüm (Geleneksel yöntemi) tam renkli bilgi verilen, sürücü, gerçekçi bir resmi yazdırmak için noktalı resim kullanabilirsiniz.

Uygulama DIB) biçiminde genel olarak tanımlı olduğundan hızlı işleyebilirsiniz. Aslında, bir uygulama Windows ile herhangi bir etkileşimi olmaksızın görüntü oluşturabilirsiniz. Windows, bir çizim temel yoksa, uygulama, varolan grafik aygıt arabirimi (GDI) temel öğeler yerine doğrudan DIB içine benzetimini yapabilirsiniz. Ne yazık ki, Windows sürüm 3.0 ve 3.1 altında GDI doğrudan DIB çıktı işlemlerini gerçekleştiremezsiniz.

bmp DOSYA BİÇİMLERİ

Windows DIB dosyasının dosya BMP uzantısıdır. Dosyayı DIB tarafından izlenen bir BITMAPFILEHEADER yapısı oluşur. Ne yazık ki, BITMAPFILEHEADER yapısını gerçekte hiçbir zaman APı'SINE geçirilen çünkü veri yapısını dikkatle BMP dosyaları oluşturan her uygulama doldurur. Bu karışıklığı için "uygun" tanımı yapısını belgelerinize adresindeki odds eklemektir. Düzgün veri yapısı, aşağıdaki alanları içerir:
   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 üstbilgi hemen BITMAPFILEHEADER yapısı aşağıdaki gibidir.

BMP dosyasını okur bir kod örneği, örnek program bakın.

DIB başlığı

Başlık, gerçekte komşu iki bölümden oluşur: uygun başlık ve renk tablosu. Her ikisi de, ne, tüm DIB Apı'lar beklediğiniz BITMAPINFO yapısı içinde birleştirilir.

<a1>Windows</a1> sürüm 3.0, başlıklarının iki çeşitlemelerine destekler: BITMAPINFOHEADER ve BITMAPCOREHEADER. En tüm Olanaklıysa, uygulamalar yalnızca BITMAPINFOHEADERs kullanmalıdır. BITMAPCOREHEADER tanım sunu Yöneticisi sürüm 1.1 bit eşlem tanımından dayanır ve uyumluluk için desteklenir.

DIB ayarı işlemi sırasında çoğu alanları zaten doldurulmuştur tarafından whoever DIB oluşturulur. Bir GetDIBits() arama yaparsanız, ancak daha fazla denetim sağlar. Bu işlem için başlık doldurulduğunda nasıl, elde edilen DIB, özellikle kendi renk çözünürlüğünü tanımlar.

BITMAPINFOHEADER aşağıdaki alanları içerir:
   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)
                                      &amp; ~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.
				
renk tablosu, başlık bilgilerini hemen izler. Renk tablo için 24 bit Dıb'leri tanımlanır. Tablo RGBQUAD veri yapıları dizisi içerir. (BITMAPCOREINFO biçimi için tablo RGBTRIPLE veri yapısı ile yerleşik olarak bulunur.) Kırmızı, yeşil ve mavi bayt Windows kuralı ters siparişten (kırmızı swaps konum ile mavi) arasındadır. Sunu Manager uyumluluğu'den başka bir leftover budur.

Renk tablosunun boyutunu biBitCount değerine bağlı (ve biClrUsed alanını kullanarak geçersiz kılınabilir; yukarıya bakın):
   if (!(nNumColors = biClrUsed))
   {

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

   }
   nTableSize = nNumColors * sizeof(RGBQUAD);
				
en geçerli kayan Dıb'leri biClrUsed 0 olarak ayarlandığında sahip ancak full-fledged DIB bashing Planlandı, doğru şekilde ayarlamak için iyi bir fikirdir. BiClrUsed sıfır ise, bir renk tablosu ile 24 bit Dıb'leri olasıdır. GDI, bu renk tablosu kullanmaz, ancak uygulama bu önemli DIB içinde kullanılan renkleri belirlemek için kullanabilirsiniz.

Tüm DIB işlevleri <a0>Renk</a0> tablosunun tanımı etkileyebilir wUsage parametre içerir. Bu makalede, paletleri Dıb'leri ile kullanarak önler ve böylece wUsage her zaman için DIB_RGB_COLORS ayarlanır ve renk tablo bu nedenle her zaman olduğunu, RGB değerlerini oluşan olduğunu varsayar. Renk tablosu DIB_PAL_COLORS kullanıldığında, dizin, seçili mantıksal palet içine WORD değerler oluşur. (Bu konuda "Dıb'leri paletleri ile kullanma" makalesinde ayrıntılı olarak ele alınmıştır.)

Bit biçimler

Üstbilgi bitlerin biçimini tanımlar, ancak tüm biçimler, aşağıdaki kurallar paylaşın:
  • Her scanline DWORD hizalanır. The scanline hizalamayı arabelle?e; arabelleğe alma değil her zaman 0.
  • The scanlines baş aşağı, resmin en alttaki taramada olan bellekte ilk tarama (tarama 0) ile saklanır. (Bkz: Şekil 1.) Sunu Yöneticisi uyumluluğu, başka bir Dışlayıcı budur. GDI ayarlama ve alma işlemleri sırasında otomatik olarak resmi ters çevirir. Şekil 1. (Katıştırılmış resim belleği ve ekran sunumlarını gösteren.)
  • 64 K bölütü sınırları değil olarak saygın; scanlines (64 K sınırları için arabelleğe aygıta bağımlı bit eşlem biçimi) farklı tür sınırları çapraz.
Her özelliklerini aşağıdaki biçimdedir:
  • 1 bit Dıb'leri her bit renk tabloya dizin olarak kullanarak depolanır. En anlamlı bit, en soldaki piksel ' dir.
4-bit Dıb'leri 4 her bir dizin renk tabloya temsil eden bit ile saklanır. En önemli nibble en soldaki piksel ' dir.
  • 8-bit Dıb'leri her bayt için bir dizin olduğundan depolamak en kolay olur.
  • 24 bit Dıb'leri aynı ordering <a2>Renk</a2> tablosunu kullanarak, her 3 renk, temsil eden bayt vardır. Bu renk üç--dikkatli ele zor bir koşul ortasında bir 64 K sınırı var olabilir, çünkü işlem sırasında özellikle karmaşık biçimidir.

dib APİ'Nİ KULLANMA

GetDIBits() ve SetDIBits()

Bu iki işlevi, aygıttan bağımsız bit eşlemleri içine aygıta bağımlı bit eşlemler (veya tersi dönüştürmek için kullanılır. SetDIBits() aygıta bağımlı bit eşlem için bir DIB dönüştürür ve GetDIBits() aygıta bağımlı bit eşlem ' bir DIB oluşturur.

Her iki çağrıları geçirilen hDC tarafından başvuruda bulunulan aygıt sürücüsü, gerçek çevirisini gerçekleştirir. Bazı aygıt sürücülerini bu işlevi, (örneğin, bir <a0>Windows</a0> sürümü 2.0 sürücüsü veya bir temel Windows sürüm 3.0 sürücü) olabilir. Bu durumda, GDI çevirisini taklit eder, ancak yalnızca tek içinde--siyah-beyaz renk bilgilerini dönüştürülür. Ço?unlukla, ancak, bu önemli değildir. Bu işlev tüm self-respecting görüntü sürücüleri destekler ve yalnızca birkaç yazıcı sürücüleri sağlamaz çeviri, genellikle tek renkli sürücüleri için GDI benzetimlerini yeterli.

GetDeviceCaps(hDC, RASTERCAPS), hangi DIB sürücünün desteklediği işlev gösteren ayarlamak bayraklarıyla WORD değeri döndürür. RC_DI_BITMAP GetDIBits() ve SetDIBits(), RC_DIBTODEV desteği SetDIBitsToDevice() desteğini gösterir ve RC_STRETCHDIB StretchDIBits() desteğini gösterir gösterir. (Çoğunlukla renk bilgiler kayıp olduğundan) benzetimlerini gerçek şeyi gibi yararlı sık olmasa da herhangi bir işlev desteklenmiyor, Benzetimli. Bir aygıt, bir bit olarak ayarlanmış olsa bile, tüm işlevlerini desteklemek yeniden yükleyemeyebilirsiniz. Örneğin, bir aygıtı yalnızca integral stretches için StretchDIBits desteği. Ne yazık ki, bir uygulama, uygulama completeness belirlemek için bir yol vardır. Bu gibi durumlarda, GDI işlevi taklit eder.

Parametreler GetDIBits() hem de SetDIBits() için aynıdır:
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.
				
kullanma SetDIBits() makul açıktır. Bir DIB (örneğin yerlerde, Pano veya bir disk dosyası) alınmıştır ve bir DC ve blted ekranda görüntülenmek için seçilebilecek bir bit eşlem nesnesi dönüştürülür. Bir DIB görüntülemek için en kolay yolu budur.

Not Noktalı resim yapabileceğiniz birçok yazıcı, bu yöntem tercih edilir; (aşağıdaki ele) StretchDIBits daha kullanışlıdır.

Bir DIB (hiçbir hata işleme ile) bir DC için basit bir görünümünü aşağıdadır:
   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);
				
GetDIBits() kullanarak daha karmaşık, çünkü bu uygulama oluşturmak için DIB türünü seçebilirsiniz. DıB'ın boyutları (bir parça blting daha küçük bir bit eşlem ayıklanmasını) kaynak bit eşlem boyutunu düzenler, ancak uygulamanın renk çözünürlüğünü dikte edebilirsiniz.

Başlıkta aşağıdaki alanları için uygulama düzgün çalışması için GetDIBits(), gerekli:
   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.)
				
renk tablosu için ayrılan alanı ayrıca, tam boyutlu bir tablosunu tutmak yeterli olmalıdır:
   if (biBitCount != 24)

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

   else

     nSizeTable = 0;
				
lpBits de nNumScans veri saklamak için yeterli büyüklükte olması gereken için ayrılan alan. Çağrı yapısı aşağıdaki alanlara doldurur:
  • biSizeImage = DIB verisinin bayt cinsinden boyutu
  • Renk tablosu (24 bit olmayan durumda için) uygun renkleri ile doldurulur.
  • lpBits DIB verilerle doldurulur.
GetDIBits() lpBits null olarak çağrılırsa, hiçbir bit verilir; biSizeImage ve renk tablo doldurulur. Bu seçenek, RLE ile Dıb'leri yararlıdır ve ile kodlanmış olmayan Dıb'leri için anlamlıdır değil.

Uygulamanın amaçları için DIB seçmek için hangi renk çözünürlüğünü belirleyin. Normal bir yaklaşım, kaynak aygıta bağımlı bit eşlemin renk bilgilerini koruyan bir DIB oluşturmaktır. Küçük bir çözümleme sonuçları renk bilgilerinin kaybolmasına seçme, genellikle istenmeyen olduğu. Kaynak 8-bit veya daha düşük bir çözünürlük varsa, her zaman kullanarak 24 bit çözümlemesi gereksizdir, ancak bunu yapmak için hiçbir daha çok renk çözünürlüğünü ekler.
   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;
				
(Özellikle EGA ve VGA) Bit Eşlem'in çözümlemesi hesaplama bazı aygıta bağımlı bit eşlemler planar olduğunu dikkate almanız gerekir. DIBs, diğer taraftan, her zaman ", piksel piksel başına yalnızca 1 düzlem gelişmeyle" (biPlanes = 1).

NStartScan ve nNumScans parametreleri (sunu Manager uyumluluğu residue) şerit için kullanılmak üzere tasarlanmıştır. Değilse tüm DIB bir belleğe yüklemek yeterli bellek yok, yalnızca bir kısmını bitlerin işaret edecek biçimde lpBits yapılabilir. Aşağıdaki örneği inceleyin:
   #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;

   }
				
ayarla kod verilen bant alır, çevirir ve çevrilmiş bant sırasında her zaman hesap baş - Dıb'leri yapısı aşağı doğru konumunda koyar.. Tüm bit eşlem yüksekliğini temel alarak bir bit eşlem yerleştirilen bant için nasıl biHeight istenildiği zaman değişmez dikkat edin. nStart (biHeight tarafından tanımlanır) tam bir resmin yüksekliğini temel alır.

CreateDIBitmap()

Aşağıdaki kod ile normal servis talebi arama CreateDIBitmap() gösterir:
   hBitmap = CreateDIBitmap(hDC, lpInfo, CBM_INIT, lpBits, lpInfo,
                            wUsage);
				
bu eşdeğerdir:
   hBitmap = CreateCompatibleBitmap(hDC, (WORD)lpInfo->biWidth,

             (WORD)lpInfo->biHeight);

   SetDIBits(hDC, hBitmap, 0, (WORD)lpInfo->biHeight, lpBits, lpInfo,
             wUsage);
				
üçüncü parametre ile CBM_INIT bayrağı ayarlanmamışsa, GDı'nın uygulama SetDIBits() bölümü atlar. Bu işlev, DIB dönüştürme aygıta bağımlı bit eşlem için iyi bir kısayol kodlama yapar.

SetDIBitsToDevice()

SetDIBitsToDevice() doğrudan bir aygıt yüzey bir DIB ayarlamak bir uygulama sağlar. Bu işlev bir holdout erken geliştirme'den olduğundan, arabirimi olabilir gibi parlak değil. StretchDIBits()SetDIBitsToDevice() ' den daha güçlü bir işlevdir. StretchDIBits() tümünü mü, SetDIBitsToDevice() yapar ve nicer bir arabirimi vardır. SetDIBitsToDevice() ölçek olduğundan, meta dosyaları işleme biçiminde sınırlıdır ve nStartScan ve nNumScans parametrelerle şerit en iyi nontrivial olur. Şerit StretchDIBits() izin vermiyor.

Aşağıdaki kod StretchDIBits kullanarak (şerit yok) tam bitmap üzerinde SetDIBitsToDevice() işlevleri gerçekleştirir:
   StretchDIBits(hDC, x, y, (WORD)lpInfo->biWidth,

          (WORD)lpInfo->biHeight, 0, 0, (WORD)lpInfo->biWidth,
          (WORD)lpInfo->biHeight, lpBits, lpInfo, DIB_RGB_COLORS,
          SRCCOPY)
				
nStartScan 0 olarak ayarlanır ve bu nNumScans lpInfo (yani, hiçbir şerit) biHeight-> ayarlanmıştır varsayarak temel olarak ROP SRCCOPY ve kaynağı olarak bir DIB bir BitBlt işlevidir. SrcX ve SrcY DıB'ın alana ve bu nedenle baş aşağı ilişkili etki alanı DENETLEYICISI (Y = 0 resmin altındaki'dır).

Baş aşağı ile ilgili DIB kısmi bir ayar yaparken hassas olur. Örneğin, uygulama alt bir DIB üçüncü almak istiyorsa, w h aygıt (x, y) piksel olarak ise, arama aşağıdaki benzer:
   SetDIBitsToDevice(hDC, x, y, w, h/3, 0, h/3, 0,

          (WORD)lpInfo->biHeight, lpBits, lpInfo, DIB_RGB_COLORS);
				
BIR aygıta bağımlı bit eşlemi 2 h, bir SrcY olabilir/üçüncü ancak baş ile - sistemi, bir Windows göreceli olarak uygun yere h/3 puan SrcY DIB, 3 alt düzenler.

StretchDIBits()

Bu işlev, tüm darling bir DIB bir aygıtı yüzeyine görüntülemek için kullanılır. Bu, özellikle metafiling ve uzatma yeteneğini önemli olduğu bir yazdırma için iyi olur.

Geçerli uygulamasında StretchDIBits() kritik bir bir delik StretchDIBits() yazıcı sürücüleri tarafından desteklenir ve görüntü sürücüleri tarafından birçok ' dir. Bu nedenle, sürekli ekranda bir DIB uzatmak için bu işlevi kullanmak (aygıta bağımlı bir bit eşlem almak için <a0></a0>) tarafından yinelenen StretchBlt() çağrıları ardından SetDIBits kullanmaktan belirgin şekilde yavaştır.

Bu işlev, gdı'nın uygulama çok basittir. Aygıt sürücüsü arama kendisini işleyebilir, bunu yapar. Aksi takdirde ve 1 ve 1 çağrıdır ve aygıtın SetDIBitsToDevice() destekler, çağrı dönüştürülür sürücü SetDIBitsToDevice() çağrısı için. (Bu yalnızca SRCCOPY ile ROP çalışır.) Bu yöntemlerden hiçbiri mümkünse CreateDIBitmap() bit eşlem aygıta bağımlı bir sürümünü sağlamak için kullanılır ve fiili çalışmayı yapmak için StretchBlt denir.

StretchDIBits() parametrelerini temel olarak StretchBlt() (lpBits ve lpInfo tarafından değiştirilen kaynak hDC ile) aynıdır. Bu işlev lpBits DIB bir ilk taranmasını için her zaman işaret eder, böylece nStartScan ve diğer DIB işlevleri, nNumScans parametreler yok.

Tam bir bit eşlem stretches dışında için bu işlevi kullanarak, tüm kaynak koordinatları (için DIB ilgili olanlar) bir baş aşağı sisteminde olduğunu unutmayın. Işlev, görüntüyü uygun şekilde çevrilir, ancak kaynak dikdörtgen, alt ve gitmesini kapsamlarını Y = 0 ile tanımlanır. Neyse ki, x koordinatları olarak aynı kuralları kullanın.

Yazıcı sürücüleri genellikle (örneğin, PSCRIPT ve HPPCL) bu işlevi destekleyen bir yarı ton algoritması iyi renkli resimler çıktısını almak için kullanın. Tek renkli, çıkış aygıtı olsa bile, iyi çıktı için renk bilgileri yine de yararlıdır, çünkü bu nedenle, Dıb'leri en anlamlı renk çözünürlüğü olası (genellikle 8 bit) Bakımı tercih edilir. Ne yazık ki birçok yazıcı sürücüleri SRCCOPY dışındaki herhangi bir ROP desteklemez.

CreateDIBPatternBrush()

Bu işlev olarak kullanılan CreatePatternBrush() işlevindeki bir aygıta bağımlı bit eşlem yerine bir DIB belirterek, bir desen fırça oluşturmak bir uygulama sağlar. Bu işlevi kullanılarak oluşturulan BIR fırça benzer başka bir fırça kullanılır. DIB bir aygıta bağımlı bit eşlem SelectObject() zaman kullanmak için aygıtın açık olduğundan. Bu fırça bir standart desen fırça aygıta benzer.

PANO İÇİNDEKİ dibs

Iki temel mekanizmaları Dıb'leri Pano'ya yerleştirmeden CF_DIB veri biçimi kullanıyorsanız veya DIB bir meta dosyası yerleştirme ve CF_METAFILEPICT veri biçimini kullanarak.

CF_DIB biçimi bitlerin hemen başlık ve renk tablo sonra izleyin, bir paket DIB kullanır. Bir uygulama, doğru okuma veya bir paketlenmiş DIB oluşturma, bitlerin uygun yerinde olduğundan emin olmak için renk tablosunun boyutunu hesaplamalısınız. Bit işaretçiyi tüm DIB işlevleri, bir başlık ve bir bit, iki işaretçiler olarak DIB beklemeniz için kullanılmadan önce hesaplanması gerekir. (Renk Tablo boyutu hesaplamaları için bkz: renk tablosundaki Açıklama Yukarıdaki kod örneğinde.)

Bir DIB bir meta dosyası yerleştirmek için en kolay yolu, StretchDIBits() kullanmaktır:
   hMetaDC = CreateMetaFile((LPSTR) NULL));
   StretchDIBits(hMetaDC, 0, 0, biWidth, biHeight, 0, 0, biWidth,

          biHeight, lpBits, lpInfo, DIB_RGB_COLORS, SRCCOPY);

   hMetafile = CloseMetaFile(hMF);
				
bu yaklaşım, meta dosyası oluşturur, when görüntüler kayıttan hedef DIB. Bu yöntem, geçerli eşleştirme düzenini gerekirse sığacak biçimde resmi de ölçeklendirir. Transfer için meta dosyalar kullanarak, DIB DIB bilgileri kaybetmeden Pano içeriklerini yapıştırmak için uyumlu olmayan uygulamalar da sağlar.

rle BİÇİMLER

DıB'ın başlık biCompression</a1> alanında da BI_RLE4 için ayarlandığında (için biBitCount = 4) veya BI_RLE8 (için biBitCount = 8), görüntü, kodlanmış oynatma-uzunluğu yapıldı. Kodlama düzenleri açıklaması "Microsoft Windows yazılım geliştirme seti başvuru birim 2'de," "veri türleri ve yapıları" "BITMAPINFOHEADER" bölümünde bulunabilir bölüm. Çalışma kodlama içine yatay olarak bitişik, aynı piksel olan birden çok sıkıştırma düzeni temel içerir. Örneğin, 17 renk dizinin 10 piksel çalışma uzunluğu 10 ve <a1>Dizin</a1> 17 kodlanmıştır. Son tarama ve delta gider kodlarını da, X ve Y bir mahsup hesabı için sonraki piksel sağlanır sağlanır.

Bu tür kodlama genellikle bit eşlem sıkıştırır ve de hareketli türü animasyonlar, yalnızca küçük bir bölümünü görüntünün her çerçevede değiştiği oluşturmak için yararlıdır. Animasyon yetenekleri gerçekten ayarlanan piksel sayısını sınırlamak için delta kodları kullanarak gerçekle?tirilir. Delta taşıma tarafından atlandı sol untouched pikseldir.

RLE Dıb'leri, ana fark bir uygulama kolayca bayt bit eşlem boyutunu belirleme kendisi için belirli bir scanline bir bit eşlem ilk tarama kodlama olmadan işaret, sınırlamalardır. BiSizeImage alanın ilk sorun giderme son derece yararlıdır. Kod çözme, kodlama ve genellikle RLE işleme daha yavaştır ve daha karmaşık noncompressed (BI_RGB) biçiminden biçimidir. Bazı uygulamalar--örneğin, Paintbrush--RLE Dıb'leri okumaya reddeder. Tüm Apı'lar bunları kabul olsa da, evrensel olarak desteklenen bir biçim RLE Dıb'leri olacak olmayabilir. Ayrıca, bu biçimler göreli rarity nedeniyle bazı aygıt sürücülerini tam destek kodlama ve kod çözme işlemleri için sınanmıştır değil.

Bir RLE DIB oluşturmak için <a0></a0>, istenen kodlama türü için ayarlanan biCompression GetDIBits() çağrılır. Bitlerin depolamak için gereken bellek miktarını kolayca hesaplanan değil. GetDIBits() lpBits null olarak çağrılırsa bitlerin için gereken bellek miktarını biSizeImage döndürülür. Bir sonraki çağrı lpBits doğru ölçekli bir bellek bloğu için işaret ile kodlanmış bir bit eşlem döndürür.

Aygıta bağımlı forma bir RLE DIB çevriliyor hiçbir özel işlem gerektirir. SET işlevlerinden herhangi normal olarak uygun biSizeImage ve biCompression değerleri içeren bir üstbilgiyle bitlerin eşleşmesi için kullanılabilir.

EKSİKLİKLERİNİN dibs

Büyük olasılıkla Dıb'leri en büyük bir sınırlandırılmasıdır aygıta bağımlı bit eşlemler yavaş olmalarını kapsayacaktır. Gerçekte görüntülenebileceği için önce bir aygıta bağımlı forma Dıb'leri çevriliyor. ek yükü kaynaklanan, ek işlem gerektirir. Ideal şartlar altında bir 1 ve 1 StretchDIBits() BitBlt() kadar hızlı olur. Bu hız bir uygulama, bölge, mantıksal bitmap, tam renkli ve tam erişim, fiziksel aygıt sınırlamaları ne olursa olsun, her piksel için etkili bir şekilde çalışmasına izin verir.

DIBs kodlama biraz s?k?c? ve değil sezgisel yapmadan Windows göre yukarıdan aşağı olan bir koordinat sistemi ile temel alır. Yinelemelerin sayısı ne kadar fazlaysa, çizgili doğru bir bit eşlem almak için gerekli olan sınırı, her zaman bu quirkiness anımsama yardımcı olmalıdır.

24 Bit Dıb'leri kullanarak tam renkli alabilirsiniz, ancak kod çözme, okumak ve yazmak çok yavaş olur. Bu özellikle, çeviri harfi harfine dakika sürebilir, 8 bit paleti aygıtlarda geçerlidir. Ayrıca, 24 bit Dıb'leri sheer boyutunu bunları genel kullanım için bir bit kaba yapar.

windows SÜRÜM 3.0 dib İLE İLGİLİ SORUNLARI

Meta dosyası kayıt BITMAPCOREHEADER kullanan StretchDIBits() aramalarının bir UAE neden olur. Tüm üstbilgileri, bu sorunun oluşmaması için BITMAPINFO stiline dönüştürün. Bu geçici çözümü için genel DIB önerilir işleniyor.

SetDIBits() benzetimi kodu 64 K tek renkli Dıb'leri'dan büyük bir SetDIBits(), bir SetDIBitsToDevice() veya SetDIBits() desteklemeyen bir sürücüye StretchDIBits() kullanırken çökmeleri ya da hatalı bir yazıcı çıktılarında neden olur.

Telif Hakkı 1992 Microsoft Corporation. Tüm Hakları Saklıdır.

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Windows Software Development Kit 3.1
Anahtar Kelimeler: 
kbmt kbdownload kbdownload kb16bitonly kbfile kbinfo kbsample KB81498 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:81498  (http://support.microsoft.com/kb/81498/en-us/ )
Retired KB ArticleKullanım Dışı Bilgi Bankası İçeriği Yasal Uyarı
Bu makale, Microsoft'un artık destek sağlamadığı ürünler ile ilgili olarak yazılmıştır. Bu nedenle, bu makale "olduğu gibi" sağlanmıştır ve bundan sonra güncelleştirilmeyecektir.