2016-06-16 9 views
-2

私はthis codeを使用して非常に高速なBitmapをスキャンします。PixelFormatがpf8bitの場合、スキャンラインにエラーが表示される

PixelFormat = pf24bitだと私のプログラムは256のイメージカラーでしか動作しません。そのためPixelFormat = pf8bitです。

PixelFormat = pf8bitの場合、このコードはエラーを表示します。走査線は、pf8bitを処理するために書かれていないため、コードがpf8bitで失敗した色をチェックし

procedure ReplaceColor(aBitmap: TBitmap; swap1, swap2: TRGBQuad); 
    var 
    w, h, k: Integer; 
    pScanline: pByte; 
    Red, Green, Blue, palindex: Byte; 
    PalEntries: array[0..255] of TRGBQuad; 
begin 
    if aBitmap.Palette <> 0 then 
    GetPaletteEntries(aBitmap.Palette, 0, 255, PalEntries); 

    for h := 0 to aBitmap.Height - 1 do 
    begin 
    pScanline := pByte(aBitmap.Scanline[h]); 

    for w := 0 to aBitmap.Width - 1 do 
    begin 

      Blue:= PalEntries[pScanline^].rgbBlue ; 
      Red:= PalEntries[pScanline^].rgbRed ; 
      Green:= PalEntries[pScanline^].rgbGreen ; 

      if (Blue = swap1.rgbBlue) and (Red = swap1.rgbRed) and 
      (Green = swap1.rgbGreen) then 
      begin 
      Blue := swap2.rgbBlue; 

      Green := swap2.rgbGreen; 

      Red := swap2.rgbRed; 

      end 
      else if (Blue = swap2.rgbBlue) and (Red = swap2.rgbRed) and 
      (Green = swap2.rgbGreen) then 
      begin 
      Blue := swap1.rgbBlue; 

      Green := swap1.rgbGreen; 

      Red := swap1.rgbRed; 

      end; 

     Inc(pScanline); 
    end; 
    end; 
end; 
+0

*このコードショーのエラー*に便利です問題の説明ではありません。何**エラー** **表示**ですか?どのように**エラー**を表示しますか?それはコンパイラのエラーですか?ランタイムエラー?それは間違った出力を生成しますか?あなたは問題を説明していないか、意味のある質問をしました。コンピュータ上のコードで何が起きているのかを正確に知ることができます。私たちが座っている場所からのエラーを見ることはできません。あなたが助けを望むなら、それを私たちに明確に説明する必要があります。 –

+0

Access Memory Error – AliReza

+0

私の答えで言われたように、8ビットのビットマップは、走査線のピクセルに色を保存しないでください。別々のカラーパレットに保存され、ピクセルはそのパレットのインデックスになります。カラーを交換する場合は、カラーテーブルを変更するか、インデックス値を変更する必要があります。 –

答えて

5

いけないので

var 
    w, h: Integer; 
    CurrRow, OffSet: Integer; 
    x: byte; 
    pRed, pGreen, pBlue: PByte; 
    begin 
    CurrRow := Integer(aBitmap.Scanline[0]); 
    OffSet := Integer(aBitmap.Scanline[1]) - CurrRow; 
    Result:= False; 
    for h := 0 to aBitmap.Height - 1 do 
    begin 
     for w := 0 to aBitmap.Width - 1 do 
     begin 
     pBlue := PByte(CurrRow + w * 3); 
     pGreen := PByte(CurrRow + w * 3 + 1); 
     pRed := PByte(CurrRow + w * 3 + 2); 
     end; 
     inc(CurrRow, OffSet); 
    end; 

は、今私は色を入れ替えたが、作業をいけないし、このコードを使用します。代わりにpf24bitを処理するように書かれています。

コードでは、各スキャンラインが実際のRGB値を含むwidthの3バイト(24ビット)ピクセル数で構成されていると想定しています。しかし、pf8bitでは、各走査線にビットマップのカラーパレットのインデックスである1バイト(8ビット)のピクセルが含まれています。あなたはそれをまったく考慮していません。

ではなく、より多くのこのような何かを試してみてください:

var 
    w, h: Integer; 
    pScanline: PByte; 
    Red, Green, Blue: Byte; 
    PalEntries: array[0..255] of TRGBQuad; 
begin 
    Result := False; 

    if aBitmap.Palette <> 0 then 
    GetPaletteEntries(aBitmap.Palette, 0, 255, PalEntries); 

    for h := 0 to aBitmap.Height - 1 do 
    begin 
    pScanline := PByte(aBitmap.Scanline[h]); 
    for w := 0 to aBitmap.Width - 1 do 
    begin 
     case aBitmap.PixelFormat of 
     pf8Bit: begin 
      Blue := PalEntries[pScanline^].rgbBlue; 
      Green := PalEntries[pScanline^].rgbGreen; 
      Red := PalEntries[pScanline^].rgbRed; 
      Inc(pScanline); 
     end; 
     pf24Bit: begin 
      Blue := PRGBTriple(pScanline).rgbtBlue; 
      Green := PRGBTriple(pScanline).rgbtGreen; 
      Red := PRGBTriple(pScanline).rgbtRed; 
      Inc(pScanline, SizeOf(TRGBTriple)); 
     end; 
     // etc for other color depths... 
     end; 
    end; 
    end; 
end; 

あなたはビットマップが実際に、特に、様々な色の深さで走査線の形式に関連して、どのように機能するかについていくつかの研究を行う必要があります。

Bitmaps overview

+0

8ビットピクセルのコードに何が変更されましたか – AliReza

+0

ありがとうございます。あなたのコードは役に立ちません。 – AliReza

+2

@AliReza:どのように正確に?より具体的にしてください。 –

関連する問題