오토핫키 커뮤니티

질문
2022.03.07 13:11

이미지필터 문의드려요

조회 수 198 추천 0 댓글 0


예전에 와이로님이 하시던 오토핫키+ 사용할 땐 내장이되어 편하게 사용했었는데


아무래도 오토핫키도 최신버전이 아닌경우에 호환이 안되는 문제들이 있어서


필터기능을 직접 구현하려고 하는데요


이미지 특정 색을 제외하거나 특정색만 색변경 필터 적용하여 이미지 서치를 하려고합니다.


혹시 관련 기능 코드 아시는 분 있을까요?


구글링한 경우로는 이미지 블러처리나 윤곽정도 입히는건 찾았는데


특정 색을 변환하는걸 못찾겠더라고요


참고할만한 자료나 의견 주시면 감사하겠습니다!


#SingleInstance Force

#include gdip_all.ahk  ;https://autohotkey.com/board/topic/29449-gdi-standard-library-145-by-tic/


srcImageFile = 1.png

outImageFile = 2.bmp


filter := [1,  1,  1

          ,1, -7,  1

          ,1,  1,  1]


gdipToken := Gdip_Startup()

if pBmpSrc := Gdip_CreateBitmapFromFile(srcImageFile)

{

  if pBmpOut := ImageFilterCore(pBmpSrc, filter)

    Gdip_SaveBitmapToFile(pBmpOut, outImageFile), Gdip_DisposeImage(pBmpOut)

  Gdip_DisposeImage(pBmpSrc)

}


Gdip_Shutdown(gdipToken)

MsgBox, 테스트완료

ExitApp


;filter = {w,h, factor, bias}

ImageFilterCore(pBitmap, filter)

{

  if !pBitmap or !IsObject(filter) or !filter.MaxIndex()

    return


  factor := filter.factor? filter.factor:1.0

  bias := filter.bias? filter.bias:0.0

  filterW := filter.w? filter.w: filter.h? filter.MaxIndex()//filter.h:Round(Sqrt(filter.MaxIndex()))

  filterH := filter.h? filter.h: filter.w? filter.MaxIndex()//filter.w:Round(Sqrt(filter.MaxIndex()))

  if (filterW * filterH > filter.MaxIndex())

    return


  imageW := Gdip_GetImageWidth(pBitmap)

  imageH := Gdip_GetImageHeight(pBitmap)

  if !imageW or !imageH

    return


  pBmpOut := Gdip_CreateBitmap(imageW, imageH)

  If Gdip_LockBits(pBitmap,0,0,imageW,imageH,StrideSrc,ScanSrc,DataSrc)

    return


  If Gdip_LockBits(pBmpOut,0,0,imageW,imageH,StrideOut,ScanOut,DataOut)

    return


  loop % imageW

  {

    x := A_Index - 1

    loop % imageH

    {

      y := A_Index - 1

      red := green := blue := 0.0

      loop % filterH

      {

        filterY := A_Index - 1

        loop % filterW

        {

          filterX := A_Index - 1

          

          imageX := Mod(x - filterW//2 + filterX + imageW, imageW)

          imageY := Mod(y - filterH//2 + filterY + imageH, imageH)

          Gdip_FromARGB( Gdip_GetLockBitPixel(ScanSrc, imageX, imageY,StrideSrc) , cA, cR, cG, cB)

          red += cR * filter[filterY * filterW + filterX + 1]

          green += cG * filter[filterY * filterW + filterX + 1]

          blue += cB * filter[filterY * filterW + filterX + 1]

        }

      }

      cR := factor * red + bias, cG := factor * green + bias, cB := factor * blue + bias

      cR := cR<0? 0: cR>255? 255: cR, cG := cG<0? 0: cG>255? 255: cG, cB := cB<0? 0: cB>255? 255: cB

      Gdip_SetLockBitPixel( Gdip_ToARGB(0, cR, cG, cB) ,ScanOut,X,Y,StrideOut)

    }

  }


  Gdip_UnlockBits(pBitmap,DataSrc)

  Gdip_UnlockBits(pBitmap,DataOut)

  return pBmpOut

}



List of Articles
분류 제목 글쓴이 최근변경 추천
질문 ControlClick 질문드립니다. 3 호반베르디움 2017.08.22 0/0
질문 controlclick으로 드래그 하는방법있나요? 3 칼시이나 2015.10.30 0/0
질문 Controlclick으로 비활성 창 마우스 드래그 구현 질문... 스탠리베이 2017.01.20 0/0
질문 controlclick질문드립니다 5 PlusK 2016.10.11 0/0
질문 controlsend 고수님들 한번만 봐주세요 ㅠ..ㅠ 1 비활성닉네임 2015.12.25 0/0
정보 ControlSend 명령을 이용한, 카톡으로 알림받기 간단하... 10 죠케빈 2018.01.02 0/0
질문 controlsend 엄청! 간단한질문 2 사군자vv 2015.11.23 0/0
질문 controlsend,,{esc}, 2 헐키 2015.06.17 0/0
질문 ControlSetText 질문 입니다~ 2 HyunYu 2015.03.03 0/0
질문 coordmode 모니터확장 질문좀드립니다!! 3 dasmlk 2015.11.26 0/0
질문 CoordMode 와 WingetPos에 대해 궁금한게 있습니다. 2 스웨이스 2017.01.08 0/0
질문 coordmode 질문입니다!! 2 으뜸어린이 2014.11.06 0/0
질문 could not close the previous instance of this scrip... 2 한평의해안선 2015.04.06 0/0
질문 count 관련.. 3 세나블텍 2015.07.30 0/0
질문 cpu청소? 1 석빡귀 2016.02.06 0/0
질문 CSGO에서 재미용으로 쓸 매크로 이름없는인간 2023.02.24 0/0
질문 Ctrl + Click or Ctrl + wheel 가르쳐 주세요. 7 theruin 2015.04.20 0/0
질문 ctrl+w키는 어떤건지 찾기가 너무 힘드네요;; 크루쟌 2015.09.23 0/0
질문 curl사용시 https 파일로 받으려면 옵션을 어떻게 줘야... 1 오켕 2016.04.06 0/0
질문 C언어 예제 질문좀 해도될까요? 4 세븐나이쯔 2015.11.24 0/0
Board Pagination Prev 1 ... 5678910111213 ... 209 Next
/ 209

전체 최신 인기글

전체 주간 인기글