お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"画像のエフェクト処理"





{hDIBはDIBのハンドルです Comの値によって行なわれる処理は以下の通りです
 1: 'シャープ' 2: 'ソフト' 3:'平均化'
 このままではシャープはかなり強目に処理されるので、弱く処理したい場合は
 別の処理が必要です。パレットを持つ画像は処理できません。}

procedure TForm1.Filter1(Com: Byte);
type
  TByteArray = array[0..9999] of Byte;
  PByteArray = ^TByteArray;
var
  pDIB,pSub: Pointer;
  nColors,x,y,w,h,T,yy: Integer;
  nDIB,i: Longint;
  R,G,B: PByteArray;
begin
  try
    pDIB:=GlobalLock(hDIB);
    with TBitmapInfoHeader(pDIB^) do begin
      w:=((biWidth*biBitCount+31) div 32)*4;
      h:=biHeight;
      nColors:=biClrUsed;
      if biBitCount <> 24 then nColors:=LongInt(1) shl biBitCount;
      nDIB:=SizeOf(TBitmapInfoHeader)+nColors*SizeOf(TRGBQuad);
    end;
  finally
    GlobalUnLock(hDIB);
  end;
  R:=AllocMem(((h+1)*(w div 3))*SizeOf(Byte));
  G:=AllocMem(((h+1)*(w div 3))*SizeOf(Byte));
  B:=AllocMem(((h+1)*(w div 3))*SizeOf(Byte));
  try
    pDIB:=GlobalLock(hDIB);
    pDIB:=PChar(pDIB)+nDIB;
    MainForm.Enabled:=False;
    yy:=(w-1) div 3+1;
    //データの読み込み
    i:=0;
    for y:=0 to h-1 do begin
      for x:=0 to (w-1) div 3 do begin
        B^[i]:=Byte(pDIB^);
        pDIB:=PChar(pDIB)+1;
        G^[i]:=Byte(pDIB^);
        pDIB:=PChar(pDIB)+1;
        R^[i]:=Byte(pDIB^);
        pDIB:=PChar(pDIB)+1;
        inc(i);
      end;
    end;
  finally
    GlobalUnLock(hDIB);
  end;
  try
    pSub:=GlobalLock(hDIB);
    pSub:=PChar(pSub)+nDIB;
    i:=0;
    //データの計算
    for y:=0 to h-1 do
    begin
      for x:=0 to (w-1) div 3 do
      begin
        if (y = 0) or (y = h-1) or (x = 0) or (x = (w-1) div 3) then
        begin
          Byte(pSub^):=B^[i];
          pSub:=PChar(pSub)+1;
          Byte(pSub^):=G^[i];
          pSub:=PChar(pSub)+1;
          Byte(pSub^):=R^[i];
          pSub:=PChar(pSub)+1;
        end
        else begin
          case Com of
            1: begin //シャープ
              T:=-B^[i+yy]-B^[i-1]+B^[i]*5-B^[i+1]-B^[i-yy];
              if T < 0 then T:=0;
              if T > 255 then T:=255;
              Byte(pSub^):=Byte(T);
              pSub:=PChar(pSub)+1;
              T:=-G^[i+yy]-G^[i-1]+G^[i]*5-G^[i+1]-G^[i-yy];
              if T < 0 then T:=0;
              if T > 255 then T:=255;
              Byte(pSub^):=Byte(T);
              pSub:=PChar(pSub)+1;
              T:=-R^[i+yy]-R^[i-1]+R^[i]*5-R^[i+1]-R^[i-yy];
              if T < 0 then T:=0;
              if T > 255 then T:=255;
              Byte(pSub^):=Byte(T);
              pSub:=PChar(pSub)+1;
            end;
            2: begin //ソフト
              Byte(pSub^):=(B^[i+YY-1]*8+B^[i+yy]*12+B^[i+yy+1]*8+B^[i-1]*12
                           +B^[i]*20+B^[i+1]*12+B^[i-yy-1]*8+B^[i-yy]*12
                           +B^[i+yy+1]*8) div 100;
              pSub:=PChar(pSub)+1;
              Byte(pSub^):=(G^[i+YY-1]*8+G^[i+yy]*12+G^[i+yy+1]*8+G^[i-1]*12
                           +G^[i]*20+G^[i+1]*12+G^[i-yy-1]*8+G^[i-yy]*12
                           +G^[i+yy+1]*8) div 100;
              pSub:=PChar(pSub)+1;
              Byte(pSub^):=(R^[i+YY-1]*8+R^[i+yy]*12+R^[i+yy+1]*8+R^[i-1]*12
                           +R^[i]*20+R^[i+1]*12+R^[i-yy-1]*8+R^[i-yy]*12
                           +R^[i+yy+1]*8) div 100;
              pSub:=PChar(pSub)+1;
            end;
            3: begin //平均化(平滑化)
              Byte(pSub^):=(B^[i]+B^[i]+B^[i-yy]
                           +B^[i+yy]+B^[i-1]+B^[i-yy-1]+B^[i+yy-1]+B^[i+1]
                           +B^[i-yy+1]+B^[i+yy+1]) div 10;
              pSub:=PChar(pSub)+1;
              Byte(pSub^):=(G^[i]+G^[i]+G^[i-yy]+G^[i+yy]+G^[i-1]+G^[i-yy-1]
                           +G^[i+yy-1]+G^[i+1]+G^[i-yy+1]+G^[i+yy+1]) div 10;
              pSub:=PChar(pSub)+1;
              Byte(pSub^):=(R^[i]+R^[i]+R^[i-yy]+R^[i+yy]+R^[i-1]+R^[i-yy-1]
                           +R^[i+yy-1]+R^[i+1]+R^[i-yy+1]+R^[i+yy+1]) div 10;
              pSub:=PChar(pSub)+1;
            end;
          end;
        end;
        inc(i);
      end;
    end;
  finally
    GlobalUnLock(hDIB);
  end;
  FreeMem(R,((h+1)*(w div 3))*SizeOf(Byte));
  FreeMem(G,((h+1)*(w div 3))*SizeOf(Byte));
  FreeMem(B,((h+1)*(w div 3))*SizeOf(Byte));
end;

  奇珍館<http://www.kh.rim.or.jp/~yun/> 12月6日 更新!
  画像処理フリーソフト GAZE Ver1.60[奇珍館にて公開中] JCC01421 YUN

Original document by YUN          氏 ID:(JCC01421)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum