27 Ağustos 2019 Salı

Resim Formatları

Bitmap
İlk iki byte BM karakteridir. Geri kalan her alan 4 byte büyüklüğündedir. Şöyledir
std::vector<BYTE> header(offset, 0);
header[0] = signature[0];
header[1] = signature[1];

HEADERS(2, fileSize);
HEADERS(6, 0);
HEADERS(10, offset);
HEADERS(14, DIBSize);
HEADERS(18, bitmapWidth);
HEADERS(22, bitmapHeight);

header[26] = (BYTE)numPlanes;
header[27] = (BYTE)(numPlanes >> 8);
header[28] = (BYTE)bitsPerPixel;
header[29] = (BYTE)(bitsPerPixel >> 8);

HEADERS(30, compressionMethod);
HEADERS(34, bitmapSize);
HEADERS(38, horizontalResolution);
HEADERS(42, verticalResolution);
HEADERS(46, numColors);
HEADERS(50, impColorCount);
HEADERS(54, redBitmask);
HEADERS(58, greenBitmask);
HEADERS(62, blueBitmask);
HEADERS(66, alphaBitmask);
RAW
Açıklaması şöyle. Sensörden gelen işlenmemiş ham veridir.
...a raw image stores the input as it comes off the sensor, so each pixel will have a single colour and 12-16 bit value depending on your model of camera.
HEIC
Açıklaması şöyle. Apple ürünlerinde kullanılan format.
Apple Products are known for having extremely high-quality cameras with the ability to capture dynamic and high-definition images using your easily accessible mobile device. 
..
These images, though they can easily meet the needs of any project due to their clarity and definition, are not saved in an easily transferable format. The HEIC file format is the default for all iPhone and Apple images, which is how they can retain their quality, but this format is not compatible with many different Operating Systems. While Macs now have the ability to read HEIC, Windows 10 does not have any built-in support and needs a third-party viewer to access them. 
JPEG veya JPG
Açıklaması şöyle.
JPEG file is made up of a series of segments each started by a two byte marker - 0xFF and another byte to indicate the type of segment.
Huffman
Açıklaması şöyle.
The JPEG standard provides general-purpose Huffman tables; encoders may also choose to generate Huffman tables...
Metadata
JPEG ile kullanılan metadata ile ilgili bir örnek burada. Metadata içinde bir sürü alan olabiliyor. Açıklaması şöyle
It has some metadata: text Exif tags as well as 8.6kB of Color Profile information, and a 5,557-byte Thumbnail as well as a 648,534-byte Preview Image (that I cannot read) and some other random things (like Face Detect Area) that take up little space
Metadata içindeki COM (Comment'in kısaltması) isimli bir alan ile ilgili bir zamanlar önemli bir güvenlik açığı varmış.

Sıkıştırma
JPEG sıkıştırması, az veya çok biraz kayıp getirir. Yani lossy bir formattır. Sıkıştırma özelliği en çok çok renkli resimlerde işe yarar.
"JPEG images are saved using downsampling techniques. Because of this, the image is distorted a little (or a lot) after compression, depending on the quality setting.

JPEG is best used for phographs and in-game screen shots, or anything else that includes vivid amount of colors.

JPEG is not recommended for images with flat colors, or sharp edged art (i.e blank desktops) as PNG is better suited for this type of image."
Sıkıştırma kalitesi ile oynayarak dosya büyüklüğünü değiştirmek mümkün.

Eğer bir JPEG resmi açılıp tekrar JPEG olarak kaydedilirse resimde daha da bozulma olur.
Be aware that JPEG compression quality loss is cumulative, meaning that if you open a JPEG image and edit it (crop, change color, resize, etc.) and resave it as a JPEG image quality will be lost. It is a good idea not to repeatedly save as a JPEG.
Sıkıştırma algoritması şöyle.
1. Convert colorspace. If desired, downsample color information (chroma subsampling) (Lossy). If not downsampled, loss of information is the result of rounding error.

2. Segmentation. Divide each channel into 8x8 blocks (MCU = Minimal Coding Unit). (Lossless)

Note: If chroma subsampling is enabled, MCUs may effectively be 16x8, 8x16, or 16x16, in terms of the original image. However, the MCUs are still all 8x8 blocks.

3. Discrete Cosine Transform (DCT) on each MCU. Loss of information is the result of rounding error.

4. Quantization. The value in each cell of the MCU is divided by a number specified in a quantization table (DQT). Values are rounded down, many of which will become zero. This is the primary lossy portion of the algorithm.

5. Zig-Zag Scan. Rearrange values in each MCU into a sequence of numbers following a zig-zag pattern. The zeros that occurred during quantization will be grouped together. (Lossless)

6. DPCM = Differential Pulse Code Modulation. Convert the number sequences into a form that is easier to compress. (Lossless)

7. RLE = Run Length Encoding. Consecutive zeros are compressed. (Lossless)

8. Entropy/Huffman Coding. (Lossless)
Renk Biti
Kanal başına bir renk için 8 bit kullanır. Üç renk için 24 bit kullanır. Açıklaması şöyle.
A jpeg file will have 3 colours for each pixel with every chanel at 8 bits.
Alpha Kanalı
JPEG alpha kanalını desteklemez.

Renk Uzayı
Renk uzayı olarak CMYK,YCCK kullanılabilir. Açıklaması şöyle
  • Images encoded with only one component are assumed to be grayscale data in which 0 is black and 255 is white.
  • Images encoded with three components are assumed to be RGB data encoded as YCbCr unless the image contains an APP14 marker segment as specified in 6.5.3, in which case the colour encoding is considered either RGB or YCbCr according to the application data of the APP14 marker segment. The relationship between RGB and YCbCr is defined as specified in Rec. ITU-T T.871 | ISO/IEC 10918-5.
  • Images encoded with four components are assumed to be CMYK, with (0,0,0,0) indicating white unless the image contains an APP14 marker segment as specified in 6.5.3, in which case the colour encoding is considered either CMYK or YCCK according to the application data of the APP14 marker segment. The relationship between CMYK and YCCK is defined as specified in clause 7.
TIFF - Tagged Image File Format
Renk Uzayı
CMYK kullanır. Açıklaması şöyle.
The de facto standard raster image format for CMYK printing is TIFF.

Renk biti
Bir renk için 8 veya 16 bit kullanır.

GeoTIFF
Açıklaması şöyle.
...which is a special type of TIFF that stores the information necessary to place each pixel in the image on the surface of the Earth. It’s an incredibly flexible and useful format, and is increasingly by adopted to store more types of data than just images.
GIF
Header
Açıklaması şöyle
Every GIF image has the characters "GIF87a" as the first 6 bytes
Renk biti
Bir piksel için 8 bit kullanır.  Yani sadece 256 renk olabilir.

Frame Sayısı
GIF frame'lerden oluşur. Görmek için şöyle yaparız.
$ exiftool giphy.gif
ExifTool Version Number         : 10.10
File Name                       : giphy.gif
Directory                       : .
File Size                       : 2.1 MB
File Modification Date/Time     : 2018:04:22 21:00:42-04:00
File Access Date/Time           : 2018:04:22 21:01:03-04:00
File Inode Change Date/Time     : 2018:04:22 21:00:52-04:00
File Permissions                : rw-rw-r--
File Type                       : GIF
File Type Extension             : gif
MIME Type                       : image/gif
GIF Version                     : 89a
Image Width                     : 500
Image Height                    : 281
Has Color Map                   : Yes
Color Resolution Depth          : 7
Bits Per Pixel                  : 7
Background Color                : 127
Animation Iterations            : Infinite
XMP Toolkit                     : Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27
Creator Tool                    : Adobe Photoshop CS6 (Macintosh)
Instance ID                     : xmp.iid:C312DB1DA6A311E5B8F5D2BA262E999D
Document ID                     : xmp.did:C312DB1EA6A311E5B8F5D2BA262E999D
Derived From Instance ID        : xmp.iid:C312DB1BA6A311E5B8F5D2BA262E999D
Derived From Document ID        : xmp.did:C312DB1CA6A311E5B8F5D2BA262E999D
Frame Count                     : 33
Duration                        : 2.31 s
Image Size                      : 500x281
Megapixels                      : 0.141
Frame Uzunluğu
Her frame 10 ms'dir. Açıklaması şöyle.
the resolution of frame times in GIF is 10ms

PNG
Resim Formatları - PNG yazısına taşıdım.

Resim Formatına Erişme
Java
IIOMetadata sınıfı kullanılır.
ImageReader imageReader = ...
IIOMetadata metadata = imageReader.getImageMetadata(0);

22 Ağustos 2019 Perşembe

git rebase seçeneği

Giriş
Söz dizimi şöyle
git rebase <branch>
Açıklaması şöyle
rebase your current HEAD onto the specified branch
1. rebase ve merge seçenekleri yerel depodaki branch'leri birleştirmek için kullanılır. Eğer öncesinde git fetch komutunu çalıştırırsak uzak depo ile senkronize olacağımız için pratikte git pull --rebase çalıştırmış gibi oluruz.

2. merge seçeneği ile benzerdir ancak dallanma ile alakalı kayıt kalmaz. rebase başlangıç noktasını değiştirir. Açıklaması şöyle.
The first thing to understand about git rebase is that it solves the same problem as git merge. Both of these commands are designed to integrate changes from one branch into another branch—they just do it in very different ways.
Ne Faydası Var
Açıklaması şöyle
To avoid merge commit, we use rebasing. With rebasing we re-write the history. Rebase puts the entire feature branch on tip of master.
Git pull kullanıyorsak commit sırasını şöyle görürüz. Kendi yaptığımız değişiklikler yani f1 ve f2 push'landıktan sonra merge commit olarak m4 ve m5 yapılır
m1 -> m2 -> m2 -> f1 -> f2 -> m4 -> m5 -> merged with master
Git rebase kullanıyorsak commit sırasını şöyle görürüz. Bizden önce yapılan değişikliklerden sonra kendi yaptığımız değişiklikler yani f1 ve f2 push'lanır.
m1 -> m2 -> m2 -> m4 -> m5 -> f1 -> f2
Şeklen şöyle


Örnek
Elimizde şöyle iki branch bir olsun
A--B--C------F--G  (master)
       \    
        D--E  (feature)
rebase ile şöyle olur. Yani branch'in başlangıç noktası değişir.
A--B--C------F--G  (master)
                 \
                  D'--E'  (feature)
Force Push
rebase edilen branch tekrar uzak depo'ya pushlanırken bazen hata alınır. Bu yüzden
git push --force komutu kullanılır. Açıklaması şöyle
So if you already pushed your commits to the remote repository, you will need to use –force after rebasing because the commit hash is completely changed.

Diğer
IntelliJ Idea kullanırken "Update Project" yapınca seçince karşımıza 3 tane seçene çıkıyor.
1. Merge
2. Rebase
3. Branch Default

Kullanım
Örnek
Şöyle yaparız
# Go to the feature branch
git checkout feature

# Make a rebase to place the feature commits 
# to the last place in history
git rebase main

# Update origin branch
git checkout main
git merge --ff-only feature
git push origin main

# We can delete the feature branch safely
git branch -d feature
--abort seçeneği
Açıklaması şöyle
At any time, we can use the --abort parameter to abort the rebase action, and the branch will return to the state before the rebase started.
Örnek
Şöyle yaparız
git rebase -—abort
-i /--interactive seçeneği
Örnek
Şöyle yaparız.
git rebase -i
Örnek
En son N commit'i birleştirmek için şöyle yaparız.
git rebase -i HEAD~N 
vi penceresi açılır
> git rebase -i HEAD~4


s cacc52da add: qrcode
s f072ef48 update: indexeddb hack
s 4e84901a feat: add indexedDB floder
s 8f33126c feat: add test2.js

# Rebase 5f2452b2..8f33126c onto 5f2452b2 (4 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
-x/--exec seçeneği
Örnek
Şöyle yaparız. Her commit'te belirtilen uygulamayı çalıştırır.
git rebase --interactive --exec CodeFormatter.exe --root
Kısa hali için şöyle yaparız.
git rebase -i -x CodeFormatter.exe --root