아래 코드에서 pixel 배열에 R,G,B 값이 들어있으므로 원하는 컬러를 투명하게 처리할 수 있다.
색깔 범위를 +- 5~10정도 주면 좀 더 배경을 잘 제거 할 수 도 있을 것이다.
from PIL import Image
# 이미지 파일 열기
image = Image.open("image.png")
# 새로운 alpha channel 생성
alpha_data = []
for pixel in image.getdata():
if pixel[0] == 255 \
and pixel[1] == 255 \
and pixel[2] == 255:
alpha_data.append(0)
else: # 그 외의 경우 alpha 값을 255로 설정
alpha_data.append(255)
alpha_channel = Image.new("L", image.size)
alpha_channel.putdata(alpha_data)
# alpha channel을 이용하여 이미지의 배경을 투명하게 만듦
new_image = image.convert("RGBA")
new_image.putalpha(alpha_channel)
# 이미지 파일 저장
new_image.save("transparent_image.png")
색상 범위를 쉽게 주려면? 아래 코드 참고
# 색상 범위 설정
lower_color = (245, 245, 245) # 검색할 색상 범위의 최소값
upper_color = (255, 255, 255) # 검색할 색상 범위의 최대값
if lower_color <= pixel <= upper_color:
alpha_data.append(0)
else: # 그 외의 경우 alpha 값을 255로 설정
alpha_data.append(255)
포인트 리스트를 가지고 그림을 드로잉하고, 이것을 원하는 크기로 Resize 하고, 투명 이미지 datauri 만들기...
pointlist = '[(10,10)(20,20)(40,50)(60,80)][(10,80)(24,70)(40,60)(60,40)]'
# image 필드에 데이터가 없는 목록만 뽑아서 배치 작업을 수행한다.
def to_datauri(sn):
sn = sn.strip()
# 정규표현식으로 포맷 문자열에서 점 정보 추출
point_regex = r"\(([-+]?\d+),([-+]?\d+)\)"
strokes = sn.replace('[', '')
strokes = strokes.split(']')
strokes = [ s for s in strokes if s!='' ]
# 그래프 그리기
plt.figure()
fig, ax = plt.subplots(figsize=(3, 2))
ax.set_facecolor('none') # 배경 투명
fig.patch.set_alpha(0) # 배경 투명
# 축과 눈금 숨기기
ax.axis('off')
# 각 획별로 분리하여 그리기
for stroke in strokes:
points = re.findall(point_regex, stroke)
if len(points)==0:
continue
x_list = [int(point[0]) for point in points]
y_list = [int(point[1]) for point in points]
ax.plot(x_list, y_list, color='black', lw=2)
plt.gca().invert_yaxis() # y축 뒤집기
# 그래프 저장
buf = io.BytesIO()
plt.savefig(buf, format='png', bbox_inches='tight')
buf_resized = buf
## resize 작업
buf.seek(0)
img = Image.open(buf)
img_resized = img.resize((150,100), Image.Resampling.LANCZOS)
# img_resized = img.resize((150,100), Image.ANTIALIAS)
# sampling=Image.ANTIALIAS deprecated 되었다. 버전에 따라 위 둘 중 하나를 사용.
buf_resized = io.BytesIO()
img_resized.save(buf_resized, format=img.format)
# buf대신 buf_resized를 변환
buf_resized.seek(0)
data_uri = 'data:image/png;base64,'+base64.b64encode(buf_resized.read()).decode('utf-8')
plt.close()
plt.clf()
plt.close('all')
img.close()
img_resized.close()
buf.close()
buf_resized.close()
return data_uri
이 함수를 사용하여 드로잉 데이터를 넣으면, datauri 텍스트가 출력된다.
시작,끝 따옴표를 제거한 텍스트를 복사해서 브라우저 URL창에 넣으면 드로잉된 투명이미지가 나온다.. (드래그해 보면, 선만 움직이는 것을 확인할 수 있다. 배경투명)
y축을 뒤집은 이유는? 모니터 스크린 좌표계에서 보통 좌상단이 (0,0) 이다. plot에서는 좌하단이 (0,0)이다. 따라서 스크린 좌표계로 보이게 하려고 하였다.
datauri가 아니라 파일로 저장하려면 plt.close() 전에 plt.savefig('test.png') 로 저장하면 된다.
4. 아이템 class. User class (getter and setter 는 alt+insert키로 쉽게 자동생성 하세요.. )
public class User {
private String profile ;
private String id ;
private int pw ;
private String userName ;
5. CustomAdapter class
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.CustomViewHolder> {
private ArrayList<User> arrayList ;
private Context context ;
public CustomAdapter(ArrayList<User> arrayList, Context context) {
this.arrayList = arrayList;
this.context = context;
}
@NonNull
@Override
public CustomAdapter.CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false) ;
CustomViewHolder holder = new CustomViewHolder(view) ;
return holder; // 홀더 리턴
}
@Override
public void onBindViewHolder(@NonNull CustomAdapter.CustomViewHolder holder, int position) {
Glide.with(holder.itemView)
.load(arrayList.get(position).getProfile())
.into(holder.iv_profile) ;
holder.tv_id.setText(arrayList.get(position).getId());
holder.tv_pw.setText(String.valueOf(arrayList.get(position).getPw()));
holder.tv_userName.setText(arrayList.get(position).getUserName());
}
@Override
public int getItemCount() {
return (arrayList!=null ? arrayList.size(): 0);
}
public class CustomViewHolder extends RecyclerView.ViewHolder {
ImageView iv_profile ;
TextView tv_id ;
TextView tv_userName ;
TextView tv_pw ;
public CustomViewHolder(@NonNull View itemView) {
super(itemView);
iv_profile = itemView.findViewById(R.id.iv_profile) ;
tv_id = itemView.findViewById(R.id.tv_id) ;
tv_userName = itemView.findViewById(R.id.tv_userName) ;
tv_pw = itemView.findViewById(R.id.tv_pw) ;
}
}
}
6. Firebase 설정.
Tools - firebase 선택. (예전엔 수작업으로 한 거를 편리하게 다 해준다..)
우측에 Realtime Database 메뉴를 선택한다. Get started with Realtime Database 로 가서, 차례로 진행한다.
connect your app to firebase ; 브라우저로 구글 로그인하여 firebase 콘솔로 가서 프로젝트 생성까지 진행됨.
(실시간 DB를 잘 만든다. 필드도 User class에 맞게 다 맞춘다. +를 눌러 User를 만들고 다시 +를 눌러 User_01을 만들고 다시 +를 눌러 profile, id, pw, userName 필드들을 만든다. 처음엔 사용법을 몰라 어렵다. 하위 노드를 위해 미리 +를 연속해서 눌러줘야 된다. 미리 만들고, 엔터치면 하위에 추가가 안되서 삽질.. )
Add the Realtime Database to your app ; dependency 등을 알아서 설정해 준다.
그러나,... 나의 경우는 빌드시 에러가... 찾아보니, 버전 문제가 또 있다... (어쩌라고.. 정말 막막하게 만드는 버전 호환성...)
build.gradle (project) 에서 4.3.10 으로 들어가 있는데 찾아보니 버전을 14로 올리면 해결된다고 해서 해보니 성공하였음.
classpath 'com.google.gms:google-services:4.3.14'
7.MainActivity에서 RecyclerView와 Adapter 연결 및 Firebase 연동...
--no-data 옵션으로 데이터는 받지 않고, 스키마만 받을 수 있다. (create table 만 나옴)
-p 옵션은 password를 프롬프트로 입력받겠다는 의미이다. -p를 생략하면 패스워드 없이 인증하려고 시도하여 인증실패 날 수 있다. 프롬프트로 패스워드를 받지 않고 커맨드에 패스워드를 직접 넣으려면 -p[패스워드] 이렇게 공백없이 붙여쓴다. -p 옵션뒤에 공백을 넣고 패스워드를 넣으면 프롬프트로 패스워드 넣으라고 나오고, 뒤에 나온 스트링을 DB명으로 인식하여 찾게 된다.
anime girl, long light gold hair, splendid white designer fashion show concept dress, red cosplay headwear, black scarf, body portrait, red eyes, pink ribbons, slight smile, black constellation motif, windy, concept art, mini tornado stickers, black fishnet wear, highly detailed, digital painting, artstation, concept art, sharp focus, illustration, art by WLOP and greg rutkowski and alphonse mucha and artgerm and yanjun chen
아래 글은 ChatGPT가 작성하게 해 본 겁니다. 내용이 정확하지 않을 수 있으니, 조심하세요...
요약 : 기본 사항을 이해하고, 적절한 형태를 사용하고, 점차적으로 체중 증가, 부피 증가, 변화, 영양에 중점을두고 휴식을 취함으로써 데 드리프트 체중을 증가시킵니다.
"## 데드 리프트 체중을 신속하게 늘리기 위해 어떻게 운동합니까?
데드 리프트는 힘과 힘을 얻기위한 가장 중요한 연습 중 하나입니다. 또한 마스터하기 가장 어려운 운동 중 하나입니다. 모든 운동과 마찬가지로 데드 리프트 체중을 늘리려면 일관성을 높이고 운동을 올바르게 수행해야합니다. 이 기사는 데 드리프트 체중을 신속하게 늘리기 위해 운동하는 방법에 대한 팁을 제공합니다.
기본 사항을 이해하십시오
데드 리프트 체중을 늘리기 시작하기 전에 운동의 기본 사항을 이해하는 것이 중요합니다. 운동의 적절한 형태와 기술뿐만 아니라 데드 리프트에 사용되는 근육을 알아야합니다. 이렇게하면 이익을 극대화하고 부상을 예방하는 데 도움이됩니다.
적절한 형태를 사용하십시오
데드 리프트를 수행 할 때는 적절한 형태를 사용하는 것이 중요합니다. 형태는 일관성이 있어야하며 올바른 근육을 참여시키는 데 집중해야합니다. 올바른 양식을 사용하지 않는 경우 적절한 형태로 최대한 많은 무게를 들어 올릴 수 없습니다.
체중을 점차적으로 증가시킵니다
데드 리프트의 무게를 늘리면 점차적으로 수행하는 것이 중요합니다. 이로 인해 부상을 입을 수 있으므로 체중을 너무 빨리 증가시키지 않아야합니다. 편안한 체중으로 시작하고 더 강해지면서 체중을 점차적으로 증가시킵니다.
볼륨 증가
데드 리프트 체중을 빠르게 늘리려면 운동량을 늘리는 것이 중요합니다. 이것은 운동의 더 많은 세트와 담당자를 수행하는 것을 의미합니다. 운동량을 늘리면 근육과 힘을 키우는 데 도움이됩니다.
변형을 사용하십시오
표준 데 드리프트를 수행하는 것 외에도 일상에 변형을 통합해야합니다. 이것은 운동을 흥미롭고 도전적으로 유지하는 데 도움이 될 수 있습니다. 데드 리프트의 변화는 다른 근육을 목표로하는 데 도움이 될 수 있습니다.
영양에 중점을 둡니다
영양은 힘을 얻고 데 드리프트 체중을 증가시키는 데 중요한 요소입니다. 균형 잡힌 식단을 먹고 충분한 단백질을 섭취하면 근육을 키우고 운동을 지원하는 데 도움이됩니다.
나머지
휴식은 모든 운동 루틴의 중요한 부분입니다. 휴식은 근육이 회복하는 데 도움이되며 부상을 예방하는 데 도움이됩니다. 운동 사이에 충분한 휴식을 취하십시오.
이 팁을 따르면 데드 리프트 체중을 신속하게 늘릴 수 있어야합니다. 적절한 형태를 사용하고 체중을 점차적으로 늘리는 것을 잊지 마십시오. 변형을 사용하여 운동을 흥미롭게 유지하고 영양에 초점을 맞추십시오. 마지막으로 운동 사이에 휴식을 취하십시오."
- JDK 설치
cp openlogic-openjdk-8u342-b07-linux-x64.tar.gz /usr/lib/jvm/
cd /usr/lib/jvm
tar xvfz openlogic-openjdk-8u342-b07-linux-x64.tar.gz
mv openlogic-openjdk-8u342-b07-linux-x64 openjdk-8
rm openlogic-openjdk-8u342-b07-linux-x64.tar.gz
JAVA_HOME은 아래와 같다.
/usr/lib/jvm/openjdk-8
- tomcat 설치
; tomcat 계정 생성
루트 계정으로 아래 작업!
useradd -d /home/tomcat8 -M tomcat8 ; 계정 생성. (홈디렉터리 생성하려면 -M 대신 -m)
(참고) userdel -r tomcat8 ; tomcat8 계정 및 폴더 삭제.
; apache-tomcat-8.5.84.tar.gz 을 설치할 위치로 복사.
mv apache-tomcat-8.5.84.tar.gz /home
cd /home
tar xvfz apache-tomcat-8.5.84.tar.gz
mv apache-tomcat-8.5.84 tomcat8
; 이름을 간단하게 tomcat8로 변경. 위 tomcat8 계정의 home 디렉터리가 됨.
- 권한 설정
chown -R tomcat8:tomcat8 /home/tomcat8
- 기본적인 설정 작업
$ cd /home/tomcat8/conf
$ vi server.xml
; 예를 들어서 포트 변경을 다음과 같이 할 수 있다. WAS 포트는 58080, 58443 으로 한다.
<Connector port="58080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="58443" />
AJP 포트는 58009 로 설정한다.
<Connector protocol="AJP/1.3"
address="0.0.0.0"
secretRequired="false"
port="58009"
redirectPort="58443" />
서비스 구동 스크립트 (아래 내용을 그대로 붙여 넣으면 파일이 생성됨.) (직접 편집하려면 [Unit] 부터 EOF 이전까지 복사해서 붙여넣기 사용) 경로명을 잘 확인한다.