'Tip > Windows' 카테고리의 다른 글
| Gemini 로 만든 주사위 게임 (0) | 2025.12.31 |
|---|---|
| [Go] JPEG 파일 크기는 유지하고 사이즈만 줄이는 코드 (0) | 2025.11.27 |
| [AWK] 파일을 분류해서 A-Z 폴더로 이동하기 (0) | 2025.11.08 |
| Gemini 로 만든 주사위 게임 (0) | 2025.12.31 |
|---|---|
| [Go] JPEG 파일 크기는 유지하고 사이즈만 줄이는 코드 (0) | 2025.11.27 |
| [AWK] 파일을 분류해서 A-Z 폴더로 이동하기 (0) | 2025.11.08 |

http://chobocho.com/tools/dice.html
대항해시대2 스타일 다이스 게임 V1.1
Min -10 100 G +10 게임 시작
chobocho.com
| Gemini 로 만든 오델로 게임 (0) | 2025.12.31 |
|---|---|
| [Go] JPEG 파일 크기는 유지하고 사이즈만 줄이는 코드 (0) | 2025.11.27 |
| [AWK] 파일을 분류해서 A-Z 폴더로 이동하기 (0) | 2025.11.08 |
package main
import (
"fmt"
"image"
_ "image/gif"
"image/jpeg"
"log"
"os"
"strconv"
// JPEG 디코딩을 위해 필요합니다.
// PNG, GIF 등 다른 형식을 지원하려면 이 아래에 해당 형식을 _로 import 해야 합니다.
_ "image/jpeg"
_ "image/png"
)
// compressImage는 입력 이미지 파일의 크기를 유지하면서 JPEG 품질을 낮춰 용량을 줄입니다.
func compressImage(inputPath, outputPath string, quality int) error {
// 1. 입력 파일 열기
inputFile, err := os.Open(inputPath)
if err != nil {
return fmt.Errorf("입력 파일 열기 오류: %w", err)
}
defer inputFile.Close()
// 2. 이미지 디코딩 (파일 내용을 image.Image 인터페이스로 변환)
// image.Decode는 파일의 형식을 자동으로 감지합니다.
img, _, err := image.Decode(inputFile)
if err != nil {
return fmt.Errorf("이미지 디코딩 오류: %w", err)
}
// 3. 출력 파일 생성
outputFile, err := os.Create(outputPath)
if err != nil {
return fmt.Errorf("출력 파일 생성 오류: %w", err)
}
defer outputFile.Close()
// 4. JPEG 인코딩 옵션 설정
// Quality는 1(최저 품질/최대 압축)부터 100(최고 품질/최소 압축)까지의 값입니다.
options := &jpeg.Options{
Quality: quality,
}
// 5. 낮은 품질로 이미지 인코딩 (재압축)
// img.Bounds()를 사용하여 이미지 크기를 그대로 유지합니다.
err = jpeg.Encode(outputFile, img, options)
if err != nil {
return fmt.Errorf("JPEG 인코딩 오류: %w", err)
}
fmt.Printf("✅ 이미지 압축 완료: %s -> %s (품질: %d)\n", inputPath, outputPath, quality)
return nil
}
func printUsage(fileName string) {
fmt.Printf("Usage: %s <input image file> [Quality]\n", fileName)
fmt.Printf(" %s input.jpg \n", fileName)
fmt.Printf(" %s input.jpg 75\n", fileName)
}
func main() {
if len(os.Args) < 2 {
printUsage(os.Args[0])
os.Exit(0)
}
if os.Args[1] == "--help" || os.Args[1] == "-h" || os.Args[1] == "/?" {
printUsage(os.Args[0])
os.Exit(0)
}
if os.Args[1] == "--version" || os.Args[1] == "-v" || os.Args[1] == "/v" {
fmt.Printf("Version: 1.0.0\n")
}
inputFileName := os.Args[1]
outputFileName := "resized_" + inputFileName
compressionQuality := 75
if len(os.Args) == 3 && os.Args[2] != "" {
quality, err := strconv.Atoi(os.Args[2])
if err != nil {
log.Fatalf("품질 값 변환 오류: %v", err)
}
compressionQuality = quality
}
if err := compressImage(inputFileName, outputFileName, compressionQuality); err != nil {
log.Fatalf("이미지 압축 실패: %v", err)
}
}

| Gemini 로 만든 주사위 게임 (0) | 2025.12.31 |
|---|---|
| [AWK] 파일을 분류해서 A-Z 폴더로 이동하기 (0) | 2025.11.08 |
| EUR-KR to UTF8 변환 코드 (0) | 2025.09.30 |
# dir/b | utf | awk -f C:\WORK\UTIL\AWK\make_folder.awk -v HEAD=%1 | utf -kr > r.bat
# r.bat
BEGIN {
if (HEAD == "") {
HEAD = "GBA_"
}
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for (i = 1; i <= length(alphabet); i++) {
first = substr(alphabet, i, 1)
folder[first] = 0
}
}
{
if ($0 ~ /\.awk/) {
print "REM SKIP AWK FILE: " $0
next
}
if ($0 ~ /r\.bat/) {
print "REM SKIP TEMP BAT FILE: " $0
next
}
# 1. 파일명 전체를 변수에 저장
file_name = $0;
# 2. 파일명의 첫 글자를 추출하고 대문자로 변환
# Windows 파일 시스템은 대소문자를 구분하지 않지만, 폴더명을 일관되게 대문자로 만듭니다.
first_char = toupper(substr(file_name, 1, 1));
# 3. 첫 글자가 영문 대문자(A-Z)인지 확인
if (first_char ~ /^[A-Z]$/) {
if (folder[first_char] == 0) {
# 4. 대상 폴더 생성 명령 실행 (move 명령어 실행 전에 폴더가 없으면 오류 발생)
print "mkdir " HEAD first_char;
}
folder[first_char]++
# 5. 파일 이동 명령 실행
# 파일명에 공백이 있을 수 있으므로 큰따옴표(\")로 감싸줍니다.
# Windows의 move 명령어 구문을 사용합니다.
print "move \"" file_name "\" " HEAD first_char "\\";
} else {
# 6. A-Z로 시작하지 않는 파일 처리
}
}
END {
for (i = 1; i <= length(alphabet); i++) {
first = substr(alphabet, i, 1)
if (folder[first] > 0) {
print "REM " HEAD first " : "folder[first]
}
}
}| [Go] JPEG 파일 크기는 유지하고 사이즈만 줄이는 코드 (0) | 2025.11.27 |
|---|---|
| EUR-KR to UTF8 변환 코드 (0) | 2025.09.30 |
| 노트북 중고 거래시 참고 사항 (0) | 2025.09.13 |
package main
import (
"fmt"
"io"
"os"
"golang.org/x/text/encoding/korean"
"golang.org/x/text/transform"
)
func main() {
if len(os.Args) < 2 {
// 표준 입력(stdin)에서 euc-kr로 인코딩된 데이터를 읽습니다.
eucKrReader := transform.NewReader(os.Stdin, korean.EUCKR.NewDecoder())
// euc-krReader에서 읽은 데이터를 utf-8로 변환하여 표준 출력(stdout)에 씁니다.
_, err := io.Copy(os.Stdout, eucKrReader)
if err != nil {
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
os.Exit(1)
}
} else if len(os.Args) == 2 && os.Args[1] == "-kr" {
// 표준 출력(stdout)을 EUC-KR 인코더로 래핑합니다.
eucKrWriter := transform.NewWriter(os.Stdout, korean.EUCKR.NewEncoder())
// 표준 입력(stdin)에서 읽은 UTF-8 데이터를 EUC-KR로 변환하여 씁니다.
_, err := io.Copy(eucKrWriter, os.Stdin)
if err != nil {
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
os.Exit(1)
}
} else {
print("Chobocho's EUC-KR to UTF-8 Converter V0.2\n" +
"Usage: utf.exe < euc_kr_file.txt\n" +
" utf.exe -kr > euc_kr_file.txt\n")
}
}| [AWK] 파일을 분류해서 A-Z 폴더로 이동하기 (0) | 2025.11.08 |
|---|---|
| 노트북 중고 거래시 참고 사항 (0) | 2025.09.13 |
| 시작 프로그램에서 삭제된 프로그램 찌꺼기 지우기 (0) | 2024.11.13 |
진짜 포장만 뜯고 안 쓴 노트북인지 확인하는 방법

부팅해서 cmd창 열고 위 명령어 넣으면 됨

생성된 파일 battery-report.html을 열어보면 아래와 같이 배터리 충방전 이력이 표시됨

| EUR-KR to UTF8 변환 코드 (0) | 2025.09.30 |
|---|---|
| 시작 프로그램에서 삭제된 프로그램 찌꺼기 지우기 (0) | 2024.11.13 |
| [C#] PictureBox 로 간단한 이미지 뷰어 만들기 (0) | 2023.09.22 |
제어판에서 프로그램 삭제를 했는데도, 시작 프로그램에 찌꺼기가 남아 있는 경우가 있다.
이럴 땐 다음과 같이 아래 폴더로 가서, 그 프로그램 바로가기 파일을 지우면 된다.
C:\Users\[사용자계정]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs

| 노트북 중고 거래시 참고 사항 (0) | 2025.09.13 |
|---|---|
| [C#] PictureBox 로 간단한 이미지 뷰어 만들기 (0) | 2023.09.22 |
| [ScanSnap] 스캔스냅 사용팁 (0) | 2021.08.09 |
C#을 배우면서 간단한 이미지 뷰어를 만들어 보았다.

기능:
Drag & Drop
R / L 키로 이미지 회전
Left, Right 화살표 키로 이미지 전환 (같은 폴더내)
Up 화살표키: 첫번째 이미지 (알파벳 순)
Down 화살표키: 마지막 이미지 (알파벳 순)
전체 소스코드:
https://github.com/chobocho/choboImageViewer
GitHub - chobocho/choboImageViewer: Simple image view by c#
Simple image view by c#. Contribute to chobocho/choboImageViewer development by creating an account on GitHub.
github.com
실행파일:
- 경고: 사용시 발생하는 어떤 이슈도 책임 지지 않습니다.
구현 관련
1. 메모리릭 이슈
- PictureBox 에 이미지를 바꿀 때에는 반드시, dispose() 메서드 호출 후 null을 대입해야 한다.
if (pictureBox.BackgroundImage != null)
{
pictureBox.BackgroundImage.Dispose();
pictureBox.BackgroundImage = null;
}
2. 파일을 읽어서, 파일이 위치한 폴더의 모든 이미지 파일 읽기. (Chat GPT 형님의 도움을 받았다)
public void setFileName(string? filename)
{
if (filename == null || !File.Exists(filename)) return;
string[] imageExtensions = { ".jpg", ".jpeg", ".png", ".gif", ".bmp", "ico" };
// 이 부분 입니다.
_filesList = Directory.GetFiles(Path.GetDirectoryName(@filename) ?? string.Empty)
.Where(file => imageExtensions.Contains(Path.GetExtension(file).ToLower()))
.Select(Path.GetFullPath).ToArray();
Array.Sort(_filesList);
_index = Array.IndexOf(_filesList, filename);
}
3. 이미지 회전
- 여기서는 dispose() 메서드 호출 하지 않는다. 호출 하면 이미지 객체가 삭제된다.
- 마지막에 pictureBox.Refresh() 메소드를 꼭 호출해 주어야 회전한 이미지로 업데이트 된다.
void rotateImage(System.Drawing.RotateFlipType angle)
{
var LoadedImage = pictureBox.BackgroundImage;
LoadedImage.RotateFlip(angle);
pictureBox.BackgroundImage = LoadedImage;
var width = LoadedImage.Width > minimumSize ? LoadedImage.Width : minimumSize;
width = LoadedImage.Width > maximumSize ? maximumSize : width;
var height = LoadedImage.Height > minimumSize ? LoadedImage.Height : minimumSize;
height = LoadedImage.Height > maximumSize ? maximumSize : height;
this.Width = width;
this.Height = height;
pictureBox.Refresh();
}| 시작 프로그램에서 삭제된 프로그램 찌꺼기 지우기 (0) | 2024.11.13 |
|---|---|
| [ScanSnap] 스캔스냅 사용팁 (0) | 2021.08.09 |
| [Excel] 엑셀 수식 자동 계산이 안 될 때 (0) | 2021.08.07 |
* 스캔스냅 으로 대량 자료 스캔시, 자동 회전이나 빈 페이지 삭제 기능이, 오히려 불편함을 초래 할 때가 있다.
해당 기능을 off 하려면 아래와 같다



| [C#] PictureBox 로 간단한 이미지 뷰어 만들기 (0) | 2023.09.22 |
|---|---|
| [Excel] 엑셀 수식 자동 계산이 안 될 때 (0) | 2021.08.07 |
| 검색 잘 하기 (0) | 2021.08.07 |
파일 > 옵션 > 수식에서 아래와 같이
통합 문서 계산 > 자동 을 선택하며 된다.

| [ScanSnap] 스캔스냅 사용팁 (0) | 2021.08.09 |
|---|---|
| 검색 잘 하기 (0) | 2021.08.07 |
| Xbox 4세대 컨트롤러 사용기 (0) | 2021.04.15 |