1.       

        private Bitmap ConvertDataGridViewToBmp1(DataGridView dg)
        {
            int height = dg.Height;
            dg.Height = dg.RowCount * dg.RowTemplate.Height;

            Bitmap bitmap = new Bitmap(dg.Width, dg.Height);
            dg.DrawToBitmap(bitmap, new Rectangle(0, 0, dg.Width, dg.Height));

            dg.Height = height;

            return bitmap;
        }

 

2.

        [DllImport("gdi32.dll", ExactSpelling = true, CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool BitBlt(IntPtr pHdc, int iX, int iY, int iWidth, int iHeight, IntPtr pHdcSource, int iXSource, int iYSource, System.Int32 dw);
        private const int src = 0xCC0020;

        private Bitmap ConvertDataGridViewToBmp2(DataGridView dg)
        {
            this.dataGridView.ColumnHeadersVisible = false;
            this.dataGridView.RowHeadersVisible = false;

            dg.Refresh();
            dg.Select();

            Graphics g = dg.CreateGraphics();
            Bitmap bitmap = new Bitmap(dg.ClientSize.Width, dg.ClientSize.Height, g);
            Graphics g = Graphics.FromImage(bitmap);
            IntPtr bitmapHoc = g.GetHdc();
            IntPtr gHoc = g.GetHdc();

            BitBlt(bitmapHoc, 0, 0, dg.ClientSize.Width, dg.ClientSize.Height, gHoc, 0, 0, src);

            g.ReleaseHdc(gHoc);

            g.ReleaseHdc(bitmapHoc);

            return bitmap;
        }

이미지 표현시 아래 처럼 에러가 발생되었다.

Failed to allocate a 88542732 byte allocation with 16768576 free bytes and 70MB until OOM

이미지 크기가 width 1440 , height 2560 을 넘으면 이런 에러가 발생된다고 한다.

이미지 크기를 조절하니 에러가 바로 사라졌다.

Xamarin Forms 에서

푸쉬알림을 Firebase, App Center 를 이용해서 처리하는 방법을 간략히 정리해봅니다.

1. Firebase 가입

https://firebase.google.com/ 가입 후 (구글 및 다른 계정으로도 로그인 가능)

https://console.firebase.google.com/ 로 이동하여 프로젝트 추가

Android 앱에 Firebase 추가 선택

안드로이드 프로젝트의 패키지명 기입 후 앱등록 이후 2,3 단계는 그냥 확인.

좌측 상단의 톱니바퀴 선택 후 프로젝트 설정으로 이동하고

클라우드 메시징 탭을 선택.

위그림과 같이 Server Key 와 SenderId 정보를 기억.

 

2. Xamarin Forms 프로젝트 구성 (.Net Standard)

 

 

3. Nuget 에서 Microsoft.AppCenter.Push 설치

 

4. App Center 가입

https://appcenter.ms 사이트로 이동하여 가입 (마이크로소프트 계정 및 구글, 페이스북 으로 로그인 가능)

App 만들기 하여 아래 그림과 같이 Android 와 Xamarin 을 선택 하여 이름 지정 후 생성

Push 를 선택하고 가이드에 따라 코딩.


AndroidManifest.xml 파일에 아래 내용  추가
<permission android:protectionLevel="signature"android:name="${applicationId}.permission.C2D_MESSAGE" />
<uses-permissionandroid:name="${applicationId}.permission.C2D_MESSAGE" />

${applicationId} 은 패키지명으로 변경 해야함.


안드로이드인 경우 아래 처럼
Push.SetSenderId("{SenderId}");
AppCenter.Start("282b7f5d-18b4-4e26-8920-8414d6df405b", typeof(Push));

Xamarin Forms 인 경우 아래 처럼 코딩
Push.SetSenderId("{SenderId}");
LoadApplication(new App());

SenderId 는 1번에서 기억해 놓은 senderID 를 이용

▼ Firebase 의 Server Key 기입

 

5. 추가 프로젝트 설정

안드로이드에서 permission 을 INTERNET 도 주어야 함

AndroidManifest.xml 파일에 아래 내용  추가

<uses-permission android:name="android.permission.INTERNET" />

 

 

참고링크

https://docs.microsoft.com/en-us/appcenter/sdk/push/xamarin-android

 

다른 방법

https://onesignal.com 을 통해서도 처리 가능

=> https://www.youtube.com/watch?v=EPIrNxuwAj8&t=851s
=> https://documentation.onesignal.com/docs/xamarin-sdk-setup

가끔 코드를 가져다 쓸때 빈 줄이 너무 많아 코드 정리 할때

일일히 지우기가 힘들때가 있다.

아래처럼 찾아바꾸기 할때 (Ctrl+ Shift + H)

정규식을 사용하여 제거 하면 한번에 제거할 수 있다.

 

^(?([^\r\n])\s)*\r?$\r?\n

 

반드시 찾는 위치를 현재 문서로 해야한다

전체 솔루션을 하게되면 assembly 파일과 designer 등 자동으로 생성된 코드까지 다 제거해 버린다.

 

추가..

 

참고 링크 :

https://www.c-sharpcorner.com/blogs/how-to-remove-blank-lines-in-visual-studio1

https://www.codeproject.com/Articles/1087859/Web-crawling-with-Csharp-part-one

 

HTTPClientThread.zip

MVCSimpleServerApp.zip

 

https://www.youtube.com/watch?v=eWrL5VQnVr8&feature=youtu.be

https://github.com/nguyenthanhliemfc/GuessNumberGame

 

 

이미지 URL 주소를 가지고 화면에 표시하고자 할 때 사용한다. 

       private Bitmap GetImageBitmapFromUrl(string url)
        {
            Bitmap imageBitmap = null;

            using (var webClient = new WebClient())
            {
                var imageBytes = webClient.DownloadData(url);
                if (imageBytes != null && imageBytes.Length > 0)
                {
                    imageBitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);
                }
            }

            return imageBitmap;
        }

 

사용은 아래와 같다.

imageView.SetImageBitmap(GetImageBitmapFromUrl(urlString));

 

추가로 아래과 같은 방법이 있는데

제대로 동작하지 않는다.;

                    // 2. FAIL
                    //URL url = new URL(urlString);
                    //Bitmap bitmap = BitmapFactory.DecodeStream(url.OpenStream());
                    //imageView.SetImageBitmap(bitmap);

                    // 3. FAIL
                    //imageView.SetImageURI(Android.Net.Uri.Parse(urlString));

 

 

                    WebView localWebView = FindViewById<WebView>(Resource.Id.LocalWebView);
                    localWebView.SetWebViewClient(new WebViewClient());

                    string html = $@"
<html>
 <body bgcolor='black'>
  <a href ='{urlString}' target='_blank'>
   <div style='width: 280px; height: 230px; overflow: hidden; position: relative;'>
    <img src='{urlString}' style='position: absolute; top:-15px; left:-95px; width:430px; height: 240px;'/>
   </div>
  </a>
 </body>
</html>
";

                    localWebView.LoadData(html, "text/html", null);

 

 

이미지 중심을 기준으로 해당 크기로 자른다.

 

        public static Bitmap CropCenterBitmap(Bitmap src, int w, int h)
        {
            if (src == null)
                return null;

            int width = src.Width;
            int height = src.Height;

            if (width < w && height < h)
                return src;

            int x = 0;
            int y = 0;

            if (width > w)
                x = (width - w)/ 2;

            if (height > h)
                y = (height - h)/ 2;

            int cw = w; // crop width
            int ch = h; // crop height

            if (w > width)
                cw = width;

            if (h > height)
                ch = height;

            return Bitmap.CreateBitmap(src, x, y, cw, ch);
        }

            ProcessStartInfo startInfo = new ProcessStartInfo(filePath);
            startInfo.Verb = "edit";

            Process.Start(startInfo);

 

'C#.NET > C#' 카테고리의 다른 글

Visual Studio 2017 에서 코드상의 빈 줄 제거 하기  (0) 2018.04.24
Web crawling with C#  (0) 2018.04.17
(C#) 그림판 실행하기  (0) 2018.03.22
(C#) png 파일을 ico 파일로 만들기  (0) 2018.03.21
Win API  (0) 2018.03.18
FileSystemWatcher (폴더 모니터링 기능)  (3) 2018.03.15

+ Recent posts

티스토리 툴바