예전에 와이로님이 하시던 오토핫키+ 사용할 땐 내장이되어 편하게 사용했었는데
아무래도 오토핫키도 최신버전이 아닌경우에 호환이 안되는 문제들이 있어서
필터기능을 직접 구현하려고 하는데요
이미지 특정 색을 제외하거나 특정색만 색변경 필터 적용하여 이미지 서치를 하려고합니다.
혹시 관련 기능 코드 아시는 분 있을까요?
구글링한 경우로는 이미지 블러처리나 윤곽정도 입히는건 찾았는데
특정 색을 변환하는걸 못찾겠더라고요
참고할만한 자료나 의견 주시면 감사하겠습니다!
#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
}